組合繼承(combination inheritance),有時(shí)候也叫作偽經(jīng)典繼承,指的是將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。
其背后的思路是使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,而通過(guò)借用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。
這樣,既通過(guò)在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性。
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);
this.age = age;
}
// 繼承方法
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function() {
alert(this.age);
}
var instance1 = new SubType("Bert", 24);
instance1.colors.push("black");
alert(instance1.colors); // red,blue,green,black
instance1.sayName(); // Bert
instance1.sayAge(); // 24
var instance2 = new SubType("Greg", 28);
alert(instance1.colors); // red,blue,green,black
instance2.sayName(); // Greg
instance2.sayAge(); // 28
上例中,SuperType 構(gòu)造函數(shù)定義了兩個(gè)屬性,name 和 colors。SuperType 的原型定義了一個(gè)方法 sayName()。 SubType 構(gòu)造函數(shù)在調(diào)用 SuperType 構(gòu)造函數(shù)時(shí)傳入了 name 參數(shù),緊接著又定義了他自己的屬性 age。然后,將 SuperType 的實(shí)例賦值給 SubType 的原型,然后又在該新原型上定義了方法 sayAge()。這樣一來(lái),就可以讓兩個(gè)不同的 SubType 實(shí)例即分別擁有自己屬性 ---- 包括 colors 屬性,又可以使用相同的方法。
組合繼承避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,融合了他們的優(yōu)點(diǎn),成為 JavaScript 中最常用的繼承模式。
而且,instanceof 和 isPrototypeOf() 也能夠用于識(shí)別基于組合繼承創(chuàng)建的對(duì)象。
- 通過(guò)構(gòu)造函數(shù)繼承,可以繼承對(duì)象上的屬性
- 通過(guò)原型繼承,可以繼承對(duì)象原型的屬性、方法
- 通過(guò)對(duì)原型添加方法,可以使得所有繼承該原型對(duì)象的子類(lèi)均可使用所添加的方法
- 通過(guò)對(duì)當(dāng)前對(duì)象定義屬性、方法,可以獨(dú)立開(kāi)其他子對(duì)象,單獨(dú)使用該對(duì)象中的屬性、方法。
這樣私有和公共的屬性、方法的擴(kuò)展性得到的極大的提升。