簡單談談javascript代碼複用模式,javascript代碼複用

來源:互聯網
上載者:User

簡單談談javascript代碼複用模式,javascript代碼複用

代碼複用有一個著名的原則,是GoF提出的:優先使用對象組合,而不是類繼承。在javascript中,並沒有類的概念,所以代碼的複用,也並不局限於類式繼承。javascript中建立對象的方法很多,有建構函式,可以使用new建立對象,並且可以動態修改對象。javascript的非類式繼承(可稱為現代繼承模式)複用方法也很多,例如,利用其它對象組合成所需要的對象,對象混入技術,借用和複用所需要的方法。

類式繼承模式-預設模式

兩個建構函式Parent和Child的例子:

複製代碼 代碼如下:
function Parent(name){
this.name = name||"Adam";
}
Parent.prototype.say = {
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"

這個結果並不是期望的,雖然子建構函式可以將參數傳遞到父建構函式中,但是這樣每次需要一個子物件時,都必須重新執行這種繼承機制,而且效率低下,原因是最終會重新建立父物件。

本文就先到這裡了,後續我們將持續更新javascript代碼複用模式的其餘幾種模式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.