根據《javascript高級程序設計》總結
用原型鏈來繼承:
function SuperClass(){} SuperClass.prototype = {}; function SubClass(){} SubClass.prototype = new SuperClass(); SubClass.prototype.constructor = SubClass;
用原型鏈來繼承雖然很簡單,但是會引起兩個問題:1.包含引用類型值的原型屬性,會被所有的實例共享;2.在創建子類型的實例時,無法給超類型的構造函數傳遞參數,實際上是無法在不影響所有的子類型實例的情況下給超類型的構造函數傳遞參數。因此根據這兩種情況,實際情況中是很少使用原型鏈來實現繼承的。
借用構造函數:
function SuperClass(){} SuperClass.prototype = {}; function subClass(){ SuperClass.call(this); }
因爲借用構造函數只會繼承定義在超類構造函數中的屬性和方法,所以實際情況下很少會單獨使用借用構造函數的方式實現繼承。
組合繼承:
將使用原型鏈繼承和借用構造函數繼承結合起來的繼承方式。
function SuperClass(){} SuperClass.prototype = {}; function subClass(){ SuperClass.call(this); } SubClass.prototype = new SuperClass();
原型式繼承:
創建一個空的構造函數,將傳入的參數對象作爲該構造函數的原型,然後返回該構造函數的一個實例。
function createObject(o){ function F(){} F.prototype = o; return new F(); }
寄生式繼承:
創建一個僅用做封裝繼承過程的函數,在函數內部對以某種方式來增強對象並返回對象。
function createAnother(original){ var another = createObject(original); another.say = function(){}; return another; }
寄生組合式繼承:
因爲組合式繼承會調用兩次超類的構造函數,會使子類中包含很多不需要的屬性。
寄生組合式繼承的思路是我們使用借用構造函數的方式來繼承屬性,使用原型鏈混成方式來繼承方法。本質上是使用寄生式繼承來繼承超類的原型,然後將它賦值給子類的原型並返回。
function inheritPrototype(subClass, SuperClass){ var prototype = createObject(SuperClass.prototype); prototype.constructor = SubClass; SubClass.prototype = prototype; } function SuperClass(){} SuperClass.prototype = {}; function SubClass(){ SuperClass.call(this); } inheritPrototype(SubClass, SuperClass);
其實寄生組合式繼承主要是因爲在實例化超類構造函數並賦值給子類原型時,將超類構造函數變成一個空的構造函數,這樣就不會給子類附加多餘的屬性了,也只調用了一次超類的構造函數。
前端悟飯