《高程》上对js继承介绍的很详细。下面说下个人的理解。
继承需要满足如下条件:
1.父类的有些属性需要每个子类实例有一个副本。(this.att)
2.父类中的有些属性(方法)需要子类实例(和父类实例)共享。(prototype)
3.子类在自己的prototype中添加属性不会被父类感知到。
组合继承(借用构造函数+原型)有问题:子类在原型中继承了父类的this.att定义的属性。与借用构造函数继承有冗余。若为此欲减少冗余可以使子类prototype直接等于父类prototype。但是这样又会使子类向prototype中添加属性时被父类感知到。
可以有以下两种方案:
1.克隆一个父类prototype对象赋给子类的prototype。(这样的话父类添加原型属性或方法子类感知不到)
2.新建一个对象赋给子类的prototype,并使这个对象的prototype指向父类的prototype。
代码:
父类:
function father(){
this.fatherattr="fatherattr";
}
father.prototype={
fathercommon:'fathercommon',
fatherfunc:function(){
console.info('execute fatherfunc');
}
}
子类:
function child(){
this.childattr="childattr";
father.call(this);
}
function createnewobj(prototype){
function newobj(){}
newobj.prototype=prototype;
return new newobj();
}
child.prototype=createnewobj(father.prototype);
child.prototype.childprivate="childprivate";
子类也可以写成一个函数:
function createchild(){
function child(){ //借用构造函数继承
this.childattr="childattr";
father.call(this);
}
function createnewobj(prototype){
function newobj(){}
newobj.prototype=prototype;
return new newobj();
}
child.prototype=createnewobj(father.prototype);//原型继承
child.prototype.childprivate="childprivate";
return new child();
}
var child1=createchild();
console.info(child1.fathercommon); |
|