1.javascript推荐的组合式继承
eg:
function SuperType(name) {
this.name = name,
this.colors = ['red','green','black']
}
SuperType.prototype.sayName =function() {
alert(this.name)
}
function SubType(name,age) {
//第二次调用SuperType()
SuperType.call(this,'dhq'); //继承父类。继承之后SubType包含父类所有的属性
this.age = age
}
//第一次调用SuperType()
SubType.prototype= new SuperType(); //继承父类方法,继承之后SubType包含父类所有的方法
SubType.prototype.constructor = SubType;
SuperType.prototype.sayAge =function() {
alert(this.age)
}
上面代码的解释:在第一次调用SuperType构造函数时,SubType.prototype会得到两个属性,name和colors,只不过现在是位于SubType.prototype上的。
当第二次调用SuperType构造函数时,又一次在新对象的上创建了两个属性,name和colors,,于是这两个属性也就屏蔽了原型中的两个同名的属性。
为了解决两次的问题也就诞生了所谓的终极方案。寄生组合式继承
2.寄生组合式继承 基于类型继承最有效的方式
思路就是通过构造函数来继承属性,通过原型链的混成形式来继承方法。
function inheritPrototype (subType,superType) {
var prototype = object(SuperType.prototype);//创建对象
prototype.constructor = subType;
subType.prototype = prototype;
}
解释:函数内部第一行创建超类型的一个副本
第二行为副本添加constructor属性,避免因为重写原型而失去constructor属性
第三行将副本赋值给子类原型
最终使用如下:
function SuperType(name) {
this.name = name,
this.colors = ['red','green','black']
}
SuperType.prototype.sayName =function() {
alert(this.name)
}
function SubType(name,age) {
SuperType.call(this,'dhq');
this.age = age,
}
inheritPrototype(subType,superType);
SuperType.prototype.sayAge =function() {
alert(this.age)
}
高效性在于只调用了一次超类型,避免了在SubType.prototype上创要的属性。因此这种方式是开发人员认为对引用类型最理想的继承范式。
//之后会补充部分关于es6 class的原型与继承相关知识…