寄生建構式模式
? 前面的幾種模式都不適用的情況下,可以使用寄生(parasitic)建構式模式,這種模式的基本思想是創建一個函式,該函式的作用僅僅是封裝創建物件的代碼,然后回傳新創建的物件;但從表面上看,這個函式又很像是典型的建構式,
function Person(name, age, sex){
var obj = new Object()
obj.name = name
obj.age = age
obj.sex = sex
obj.sleep = function() { alert(this.name + '睡覺了') }
return obj
}
var person = new Person('小明', 22, '男')
? 在這個例子中, Person 函式創建了一個新物件,并以相對的屬性和方法初始化該物件,然后又回傳了這個物件,除了使用 **new ** 運算子并把使用的包裝函式叫做建構式之外,這個模式跟工廠模式其實一模一樣的,建構式模式在不回傳值的情況下,默認會回傳新物件實體,而通過在建構式的末尾添加一個 **return **陳述句,可以重寫呼叫建構式時回傳的值,
? 這個模式可以在特殊的情況下用來為物件創建建構式,假設想創建一個具有額外方法的特殊陣列,由于不能直接修改 Array 建構式,因此可以使用這個模式:
function SpecialArray() {
// 創建陣列
var values = new Array()
// 添加值
values.push.apply(values, arguments)
// 添加方法
values.toPipedString = function(){
return this.join('|')
}
// 回傳陣列
return values
}
var colors = new SpecialArray('red', 'green', 'blue')
console.log(colors.toPipedString())
? 在這個例子中,創建了一個名叫 SpecialArray 的建構式,在這個函式內部,首先創建了一個陣列,然后 push() 方法(用建構式接收到的所有引數)初始化了陣列的值,隨后,又給陣列實體添加了一個 toPipedString() 方法,該方法回傳以豎線分割的陣列值,最后,將陣列以函式值的形式回傳,接著,呼叫了 SpecialArray 函式,向其中傳入了用于初始化陣列的值,此后又呼叫了 toPipedString() 方法,
? 關于寄生建構式模式,需要說明的是:首先,回傳的物件與建構式或者與建構式的原型屬性之間沒有關系;也就是說,建構式回傳的對想想與在建構式外部創建的物件沒有什么不同,為此,不能依賴 instanceof 運算子來確定物件的型別,由于這個問題,推薦在能夠使用其他模式的情況下,不要使用這種模式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/253896.html
標籤:JavaScript
上一篇:動態原型模式
下一篇:穩妥建構式模式
