寄生组合式继承(终极继承者)
前面学习了类式继承和构造函数继承组合使用,也就是组合继承,但是这种继承方式有个问题,就是子类不是父类的实例,而子类的原型是父类的实例。子类不是父类实例的问题是由类式继承引起的。因此还有一种更好的继承方式,那就是寄生组合式继承,也就是寄生式继承和构造函数继承的组合,因为寄生式继承依托于原型继承,原型继承又与类式继承相像。所以寄生式继承和构造函数继承的组合又称为一种新的继承方式。但是这里的寄生式继承处理的不是对象,而是类的原型。
/**
*寄生式继承 继承原型
* 传递参数 subClass子类
* 传递参数 superClass 父类
*/
function inheritPrototype(subClass,superClass) {
//复制一份父类的原型副本保存在变量中
var p = inheritObject(superClass.prototype);
//修正因为重写子类原型副本保存在变量中
p.constructor = subClass;
//设置子类的原型
subClass.prototype = p;
}
//测试代码
//定义父类
function SuperClass(name) {
this.name = name;
this.colors =["red","blue","green"];
}
//定义父类原型方法
SuperClass.prototype.getName = function () {
console.log(this.name);
};
//定义子类
function SubClass(name,time) {
//构造函数式继承
SuperClass.call(this,name);
//子类新增属性
this.time = time;
}
//寄生式继承父类原型
inheritPrototype(SubClass,SuperClass);
//子类新增原型方法
SubClass.prototype.getTime = function () {
console.log(this.time);
};
//创建两个测试方法
var instance1 = new SubClass("js",2018);
var instance2 = new SubClass("css",8102);
instance1.colors.push("black");
console.log(instance1.colors);//[ 'red', 'blue', 'green', 'black' ]
console.log(instance2.colors);//[ 'red', 'blue', 'green' ]
instance2.getName();//css
instance2.getTime();//8102
寄生组合式继承主要是通过寄生式继承重新继承父类的原型,需要继承的仅仅是父类的原型,而不需要再调用父类的构造函数,也就是说在构造函数继承中我们已经调用了父类的构造函数,因此我们需要的就是父类的原型对象的一个副本,而这个副本通过原型继承即可得到,但是直接赋值给子类会有问题,因为对父类原型对象复制得到的复制对象p中的constructor指向的不是subClass子类对象,因此在寄生式继承中要对复制对象p做一次增强,修复其constructor属性指向不正确的问题,最后将得到的复制对象p赋值给子类的原型,这样子类的原型就继承了父类的原型并且没有执行父类的构造函数。
看上去略微复杂,还得好好研究。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。