javascript代碼複用模式

原文連接:http://www.faceye.net/search/143351.htmljavascript

代碼複用有一個著名的原則,是GoF提出的:優先使用對象組合,而不是類繼承。在中,並無類的概念,因此代碼的複用,也並不侷限於類式繼承。javascript中建立對象的方法不少,有構造函數,可使用new建立對象,而且能夠動態的修改對象。javascript的非類式繼承(可稱爲現代繼承模式)複用方法也不少,例如,利用其它對象組合成所須要的對象,對象混入技術,借用和複用所須要的方法。html

類式繼承模式-默認模式java

兩個構造函數Parent和Child的例子:函數

function Parent(name){this

this.name = name||"Adam";.net

}prototype

Parent.prototype.say = {htm

return this.name;對象

};繼承

function Child(name){

}

inherit(Child,Parent);

下面是可複用繼承函數inherit()的一種實現方法:

function inherit(C,P){

C.prototype = new P();

}

這裏原型屬性應該指向一個對象,而不是一個函數,所以他必須指向一個由父構造函數所建立的實例,而不是指向構造函數自己。

在這以後,建立Child對象時,會經過原型從Parent實例得到他的功能:

var kid =new Child();

kid.say();//"Adam"

調用繼承以後的原型鏈:

進一步添加kid的屬性:

var kid = new Child();

kid.name = "Patrick";

kid.say();//"Patrick"

原型鏈的變化狀況:

能夠在本身對象屬性裏面找到name,就不用再去查找原型鏈了。

使用上述模式的缺點,其中一個缺點是同時繼承了兩個對象的屬性,即添加到this的屬性及原型屬性。大多數時候,不須要自身的這些屬性。

另一個缺點,使用inherit()繼承不支持將參數傳遞給子構造函數中,例如:

var s = new Child("Seth");

s.say();//"Adam"

這個結果並非指望的,雖然子構造函數能夠將參數傳遞到父構造函數中,可是這樣每次須要一個子對象時,都必須從新執行這種繼承機制,並且效率低下,緣由是最終會從新建立父對象。

待續

 

原文連接:http://www.faceye.net/search/143351.html

相關文章
相關標籤/搜索