您的位置:首页 > Web前端 > JavaScript

javascript最常用的继承模式-寄生组合式继承——引用类型最理想的继承范式

2012-03-22 17:25 232 查看
很多人认为组合继承是js最常用的继承模式;不过它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:

一次是在创建子类型原型的时候

另一次是在子类型构造函数内部。

这样,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。

function SuperType(name){
this.name=name;
this.color=["red","blue","green"];
}

SuperType.prototype.sayName=function(){
alert(this.name);
};

function SubType(name,age){
SuperType.call(this,name); //第二次调用SuperType()
this.age=age;
}

SubType.prototype=new SuperType(); // 第一次调用SuperType()

SubType.prototype.sayAge=function(){
alert(this.age);
}


第一次调用SuperType构造函数时,SubType。prototype会得到两个属性:name和color,他们都是SuperType的实例属性,只不过现在位于SubType的原型中。

当调用SuperType构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和color。

于是,这两个属性就屏蔽了原型中的两个同名属性。

这两个属性,一组在实例上,一组在SubType原型中。解决这个问题的方法-寄生组合式继承。

所谓寄生组合式继承,即:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法

寄生组合式继承

function inheritPrototype(subType,superType){
var prototype=object(superType.prototype);//创建对象
prototype.constructor=subType;//增强对象
subType.prototype=prototype;//指定对象
}

function SuperType(name){
this.name=name;
this.color=["red","blue","greed"];
}

SuperType.prototype.sayName=function(){
alert(this.name);
}

function SubType(name,age){
SuperType.call(this,name);
this.age=age;
}

inheritPrototype(SubType,SuperType);

SubType.prototype.sayAge=function(){
alert(this.age);
};


inhertitPrototype(subType,SuperType)函数实现了寄生组合式继承的最简单的形式。这个函数接收两个参数:子类型构造函数和超类型构造函数。

在函数内部,第一步:创建超类型原型的一个副本。

      第二步:为创建的副本添加constructor属性,从而弥补因重写原型而失去的默认的constructor属性。

      第三步:将新创建的对象赋值给子类型的原型。

这样,我们就可以调用inheritPrototype()函数,去替换前面例子中为子类型原型赋值的语句了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: