1.传统的组合式继承的缺点。
function SuperType(name,colors){
this.name=name;
this.colors=colors;
}
SuperType.prototype.getSuperProperty=function(){
return this.name;
}
function SubType(job,name,colors){
SuperType.call(this,name,colors); //第二次调用基类的构造函数
this.job=job;
}
SubType.prototype=new SuperType(); //第一次调用基类的构造函数
SubType.prototype.getSubProperty=function(){
return this.job;
}
var instance=new SubType("doctor","John",["red","green"]);
console.log(instance.getSuperProperty()); //john
传统的组合式继承,为了使子类拥有自己的实例属性,在子类的构造函数里调用了基类的构造函数,用于覆盖原型链继承的共享属性。所以,组合式继承会两次调用基类的构造函数:第一次,子类的原型声明为基类的一个实例;第二次,子类的构造函数中调用基类的构造函数。
2.寄生组合式继承
<pre name="code" class="javascript">function SuperType(name,colors){
this.name=name;
this.colors=colors;
}
SuperType.prototype.getSuperProperty=function(){
return this.name;
}
function SubType(job,name,colors){
SuperType.call(this,name,colors);
this.job=job;
}
function inherit(subType,superType){
var prototype=Object.create(superType.prototype);
prototype.constructor=subType;
subType.prototype=prototype;
}
inherit(subType,superType);
SubType.prototype.getSubPrototype=function(){
return this.job;
}
var instance=new SubType("doctor","John",["red","green"]);
console.log(instance.getSuperPrototype());
寄生组合式继承利用inherit()函数完成原型链的继承,这样我们就不需要专门为了原型继承,调用基类的构造函数。Object.create(prototype,descpritor)是ECMAScript5 中定义的方法,返回值是生成对象,第一个参数是生成对象的原型,第二个是对象,用于定义属性或者方法( https://msdn.microsoft.com/zh-cn/library/ff925952)。