组合继承

组合继承(combination inheritance):将原型链和借用构造函数(constructor stealing)组合一起。

原理:使用原型链实现对原型属性和方法的继承,使用借用构造函数实现对实力属性的继承

构造步骤:

  1. 超类型构造函数定义
  2. 拓展超类型构造函数的原型对象(可以加方法、属性)
  3. 子类型构造函数,通过借用构造函数,完成构造函数的定义
  4. 子类型继承超类型 ==> 子类型构造函数的原型对象 等于 超类型构造函数的实例
  5. 修改constructor的指向 SubType.portotype.constructor = SubType
  6. 扩展子类型构造函数的原型对象
  7. 通过子类型构造函数生成实例对象 Demo:
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
26
27
28
29
30
31
32
33
function SuperType(name) { // 超类型构造函数
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function () { // 为超类型构造函数的原型对象添加sayName方法
console.log(this.name);
};
function SubType(name,age){ // 子类型构造函数
SuperType.call(this,name); // 构造函数借用 this 指向 SubType构造函数生成的实例 ,初始化 name
this.age = age; // 设置子类型的实例属性
}
SubType.prototype = new SuperType(); // 继承(让子类型的源性对象等于超类型构造函数的实例),继承了sayName方法,name colors属性(name 、 colors会被重写)
SubType.prototype.constructor = SubType; // 让constructor指回SubType(不然constructor指向超类型构造函数)
SubType.prototype.sayAge = function(){ // 在子类型的原型对象上添加sayAge方法,扩展了原型链
console.log(this.age);
};
// 于是,子类型构造函数的实例,通过原型链,获得了sayName 和 sayAge方法 ,并且拥有各自的name,colors,age属性,互不影响
var instance1 = new SubType("Spike",22);
instance1.colors.push("black");
console.log(instance1.colors); // ['red','blue','green','black']
instance1.sayName(); // "Spike"
instance1.sayAge(); // 22
var instance2 = new SubType("Danne",39);
console.log(instance2.colors);// ['red','blue','green']
instance2.sayName(); // "Danne"
instance2.sayAge(); // 39