前面筆記介紹了JavaScript中通過原型鍊和借用構造函數實作繼承的方式方法,但是這兩種方都各有利弊,在實際的生産環境中單獨使用并不多見。接下來我們将一起學習另一種繼承的實作方式-- 組合繼承。
組合繼承(combination inheritance)又稱為僞經典繼承。指的是:将原型鍊和借用構造函數的技術組合到一起,進而取長補短發揮兩者長處的一種繼承模式。其背後的思想是:使用原型鍊實作對原型屬性和方法的繼承,而通過借用構造函數來實作對執行個體屬性的繼承。這樣一來,我們就可以實作通過在原型上定義方法進而實作函數複用,又能夠保證每個執行個體都有自己的屬性,解決原型鍊中存在的引用類型屬性共享問題。
直接上示例來直覺感受一下:
function SuperType(name){
this.colors = ["red", "blue", "green"]; // 父類對象中存在着引用類型,這裡是一個數組類型
this.name = name;
};
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name, age){
SuperType.call(this, name); // 别忘記将this對象傳遞進去,繼承了SuperType的屬性
this.age = age;
}
SubType.prototype = new SuperType(); // 繼承方法
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
alert(this.age);
};
window.onload = function(){
var instance_1 = new SubType("大頭", 22);
instance_1.colors.push("black");
alert(instance_1.colors);
alert("name : " + instance_1.name + " age : " + instance_1.age);
var instance_2 = new SubType("shenlei", 23);
alert(instance_2.colors);
alert("name : " + instance_2.name + " age : " + instance_2.age);
}
組合繼承模式避免了原型鍊和借用構造函數的缺陷,融合了它們的優點。是JavaScript中最常用的繼承模式。而且,instanceof操作符和isPrototypeOf()方法也能夠用于識别基于組合繼承模式建立的對象。