javascript設計模式介紹(六)寄生構造函數模式

這種模式的基本思想是創建一個函數,該函數的作用僅僅是封裝創建對象的代碼,然後再返回新創建的對象;但從表面上看,這個函數又很像是典型的構造函數。下面是一個例子。

function Person(name, age, job){ 
 	var o = new Object(); 
 	o.name = name; 
 	o.age = age; 
 	o.job = job; 
 	o.sayName = function(){ 
 		alert(this.name); 
 	}; 
 	return o; 
} 
 
var friend = new Person("Nicholas", 29, "Software Engineer"); 
friend.sayName(); //"Nicholas" 

在這個例子中,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", "blue", "green"); 
alert(colors.toPipedString()); //"red|blue|green" 

在這個例子中,我們創建了一個名叫 SpecialArray 的構造函數。在這個函數內部,首先創建了一個數組,然後 push()方法(用構造函數接收到的所有參數)初始化了數組的值。隨後,又給數組實例添加了一個 toPipedString()方法,該方法返回以豎線分割的數組值。最後,將數組以函數值的形式返回。接着,我們調用了 SpecialArray 構造函數,向其中傳入了用於初始化數組的值,此後又調用了 toPipedString()方法。

關於寄生構造函數模式,有一點需要說明:首先,返回的對象與構造函數或者與構造函數的原型屬性之間沒有關係;也就是說,構造函數返回的對象與在構造函數外部創建的對象沒有什麼不同。爲此,不能依賴 instanceof 操作符來確定對象類型。由於存在上述問題,建議在可以使用其他模式的情況下,不要使用這種模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章