6.2.1 原型链
js只支持实现继承,并且依靠原型链来实现的.
基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。
构造函数、原型、实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
实现原型链有一种基本模式:
FunctionSuperType(){
This.property=true;
}
Super.prototype.getSuperValue=function(){
Return this.property;
}
Function SubType(){
This.subproperty=false;
}
//继承了SuperType
SubType.prototype=new SuperType();
SubType.prototype.getSubValue=function(){
Return this.subproperty;
}
Var instance=new SubType();
Alert(instance.getSuperValue());//true
在上面代码中,我们没有使用SubType默认提供的原型,而是给它换了一个新原型;这个新原型就是SuperType的实例。这样新原型不仅具有作为一个SuperType的实例所拥有的全部属性和方法,而且内部还有一个指针,指向了SuperType的原型。最终结果就是这样:instance指向SubType.prototype,SubType.prototype又指向SuperType.prototype.
此时,instance.constructor现在指向的是SuperType。
1.默认的原型
所有函数的默认原型都是Object实例,因此默认原型都会包含一个内部指针,指向object.prototype.
6.2.2 借用构造函数(伪造对象或经典继承)
即在子类型构造函数的内部调用超类型构造函数。
FunctionSuperType(){
This.colors=["red","blue","green"];
}
Function subType(){
//继承了SuperType
SuperType.call(this);
}
Var instance1=new SubType();
Instance1.colors.push("black");
Alert(instance1.colors);//red,bllue,green,black
Var inst=new SubType();
Alert(inst.colors);//red,blue,green
通过使用call()方法,实际上是在新创建的SubType实例的环境下调用了SubperType构造函数。这样就回在新SubType对象上执行SuperType()函数中定义的所有对象初始化代码。结果,subType的每个实例就都会具有自己的colors属性的副本了。
6.2.3 组合继承
将原型链和借用构造函数的技术组合到一块。其思路是使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承。
FunctionSuperType(name)(
This.name=name;
This.colors=["red","blue","green"];
)
SuperType.prototype.sayName=function(){
Alert(this.name);
}
Function SubType(name,age){
//继承属性
SuperType.call(this,name);
This.age=age;
}
//继承方法
SubType.prototype=newSuperType();
SubType.prototype.sayAge=function(){
Alert(this.age);
}
Var inst=new SubType("Nicho",29);
Inst.colors.push("black");
Alert(inst.colors);//red,blue,green,black
Inst.sayName();//Nicho
Inst.sayAge();//29