组合继承(combination inheritance),有时候也叫作伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。
其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。
这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
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 构造函数定义了两个属性,name 和 colors。SuperType 的原型定义了一个方法 sayName()。 SubType 构造函数在调用 SuperType 构造函数时传入了 name 参数,紧接着又定义了他自己的属性 age。然后,将 SuperType 的实例赋值给 SubType 的原型,然后又在该新原型上定义了方法 sayAge()。这样一来,就可以让两个不同的 SubType 实例即分别拥有自己属性 ---- 包括 colors 属性,又可以使用相同的方法。
组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,成为 JavaScript 中最常用的继承模式。
而且,instanceof 和 isPrototypeOf() 也能够用于识别基于组合继承创建的对象。
- 通过构造函数继承,可以继承对象上的属性
- 通过原型继承,可以继承对象原型的属性、方法
- 通过对原型添加方法,可以使得所有继承该原型对象的子类均可使用所添加的方法
- 通过对当前对象定义属性、方法,可以独立开其他子对象,单独使用该对象中的属性、方法。
这样私有和公共的属性、方法的扩展性得到的极大的提升。