JavaScript中的new關鍵字可以實現執行個體化和繼承的工作,但個人認為使用new關鍵字並非是最佳的實踐,還可以有更友好一些的實現。本文將介紹使用new關鍵字有什麼問題,然後介紹如何對與new相關聯的一系列物件導向操作進行封裝,以便提供更快捷的、更易讓人理解的實現方式。
傳統的執行個體化與繼承
假設我們有兩個類,Class:function Class() {}和SubClass:function SubClass(){},SubClass需要繼承自Class。傳統方法一般是按如下步驟來組織和實現的:
Class中被繼承的屬性和方法必須放在Class的prototype屬性中
SubClass中自己的方法和屬性也必須放在自己prototype屬性中
SubClass的prototype對象的prototype(__proto__)屬性必須指向的Class的prototype
這樣一來,由於prototype鏈的特性,SubClass的執行個體便能追溯到Class的方法,從而實現繼承:
new SubClass() Object.create(Class.prototype) | | V VSubClass.prototype ---> { } { }.__proto__ ---> Class.prototype
舉一個具體的例子:下面的代碼中,我們做了以下幾件事:
定義一個父類叫做Human
定義一個名為Man的子類繼承自Human
子類繼承父類的一切屬性,並調用父類的建構函式,執行個體化這個子類
// 建構函式/基類function Human(name) { this.name = name;}/* 基類的方法儲存在建構函式的prototype屬性中 便於子類的繼承*/Human.prototype.say = function () { console.log("say");}/* 道格拉斯的object方法(等同於object.create方法)*/function object(o) { var F = function () {}; F.prototype = o; return new F();}// 子類建構函式function Man(name, age) { // 調用父類的建構函式 Human.call(this, name); // 自己的屬性age this.age = age;}// 繼承父類的方法Man.prototype = object(Human.prototype);Man.prototype.constructor = Man;// 執行個體化子類var man = new Man("Lee", 22);console.log(man);// 調用父類的say方法:man.say();
DEMO
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/