組合繼承
核心思想:使用借用構造函數的技術實現實例屬性的繼承,使用原型鏈實現原型屬性和方法的繼承。
function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(name, age){ SuperType.call(this, name); //借用構造函數,繼承了SuperType,擁有name,colors屬性,第一次調用 this.age = age; //自定義實例屬性 } SubType.prototype = new SuperType(); //構造原型鏈,繼承原型屬性和方法 SubType.prototype.constructor=SubType; SubType.prototype.sayAge = function(){ //向原型中添加方法 alert(this.age); }; var instance1 = new SubType("Nicholas", 29); //第二次調用 instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas"; instance1.sayAge(); //29 var instance2 = new SubType("Greg", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg"; instance2.sayAge(); //27
實際上,使用SubType.prototype = new SuperType();SubType將會繼承SuperType實例對象的name,colors屬性,雖然name沒有被創建
delete instance1.name; alert(instance1.name); //undefined,new SuperType()中沒有傳入實參
因此造成了一個問題,SubType.prototype上會存在不必要的,多余的屬性。如name,colors屬性同時存在於SubType.prototype和SubType中。
寄生組合式繼承
核心思想:用借用構造函數技術繼承超類型屬性,用inheritPrototype方法繼承超類型原型的方法。該方法詳細內容可查找相關資料。
該方法的好處在於只調用了一次SuperType構造函數,並且SubType.prototype上沒有多余的屬性。
該方法是引用類型最理想的繼承方式。
參考書籍:javascript高級程序設計