组合继承
- 又叫做伪经典继承
- 是指: 将原型链和借用构造函数的技术组合到一块,发挥二者之长的一种继承模式。
- 其背后的思路是: 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
- 既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
function SuperType(name) {
this.name = name;
this.color = ['red', 'blue', 'green']
}
// 创建一个方法
SuperType.prototype.sayName = function () {
console.log(this.name);
}
function SubType(name, age) {
// 继承属性
var subtype = this;
SuperType.call(subtype, name); // 这里如果不传递实参,就会undefined,相当于把SubType的name传递给SuperType的name
this.age = age;
}
/*
用这种方法,确实可以将SuperType里面的原型对象赋给SubType,但是当我想在SubType里面添加属性和方法的时候
SubType.prototype = SuperType.prototype
这一步已经指向了SuperType的原型对象,所以当想要在添加SubType的原型对象单独添加一个方法时候,不能采用这种方法
*/
SubType.prototype = new SuperType()
/*
正确方式应该是
SubType.prototype = new SuperType()
这种方法的意思为,{
var superType = new SuperType // 创建一个superType实例化对象 可以利用 superType.__proto__来访问SuperType的原型对象
所以当利用 SubType.prototype = supertype时候,首席按SubType会先在自己这里找,自己找不到就去Subtype.
prototype里面找(等价于去new SuperType实例化里面找),如果还没有,就去SuperType的原型对象里面找
(SubType -> SubType.prototype -> SubType.prototype.__proto__)
}
*/
SubType.prototype.constructor = SubType;
/*
因为上一步的操作,将 supertype = new SuperType() 的supertype 实例化 赋值给了 SubType.prototype 原型对象 所以在st实例化中,不存在constructor 在 st.__proto__ 中也就是 SubType 原型对象里面的construct 与supertype.constructor 的指向指向的是同一个 SuperType构造函数 也就证明了 st.__proto__.constructor 指向的是 SuperType构造函数 而不是 SubType
所以要为 SubType 原型对象添加 constructor 指向 SubType 构造函数
*/
SubType.prototype.myMoney = function() {
console.log('我想要有钱')
}
var st = new SubType('zz',20)
console.log(st);
// console.log(st.__proto__);
// 继承方法
一句话总结就是: 儿子想要爹的东西,但是儿子的东西又不想给爹,所以爹就把自己的东西放在实例对象的 篮子 里 给儿子,再把儿子原来有的东西放进去 儿子去爹的篮子拿,东西也往里面放。
Son.prototype = new Father()
Son.prototype.constructor = Son