組合繼承介紹
阿新 • • 發佈:2018-07-27
tool 屬性和方法 struct table 子類 push body ex18 一個
組合繼承有時候也叫偽經典繼承,指的是將原型鏈和借用構造函數技術組合到一塊,從而發揮二者之長的一種繼承模式,其背後的思路是使用原型鏈實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。這樣既通過在原型上定義方法實現了函數復用,又能保證每個實例都有它的自己的屬性。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function SuperType(name){
this .name=name;
this .colors=[ "red" , "blue" , "green" ];
}
SuperType.prototype.sayName= function (){
console.log( this .name);
}
function SubType(name,age){
SuperType.call( this ,name);
this .age=age;
}
SubType.prototype= new SuperType();
SubType.prototype.constructor=SubType;
SubType.prototype.sayAge= function (){
console.log( this .age);
}
var instance1= new SubType( "zxf" ,24);
instance1.colors.push( "black" );
console.log(instance1.colors); //["red","blue","green","black"]
instance1.sayName(); //"zxf"
instance1.sayAge(); //24
var instance2= new SubType( "jay" ,36);
console.log(instance2.colors); //["red","blue","green"]
instance2.sayName(); //"jay"
instance2.sayAge(); //36
|
在這個例子中,supertype構造函數定義了兩個屬性,name和colors。supertype的原型定義了一個方法sayname()。subtype構造函數調用supertype時傳入了name參數,緊接著又定義了它自己的屬性age。然後將supertype的實例賦值給subtype的原型,然後又在該新原型上定義了方法sayage()。這樣一來,就可以讓兩個不同的subtype實例既可以擁有屬性--包括colors屬性,又可以使用相同的方法。
組合式繼承缺點是:調用了兩次supertype構造函數,一次在賦值subtype的原型時,一次在實例化子類時call調用,這次調用會屏蔽原型中的兩個同名屬性。
組合繼承介紹