7.继承
7.1原型链
function superType(){
this.property = true;
this. superA = 12;
}
superType.prototype. superA = 23;
superType.prototype.getSuperValue = function(){
return this.property;
}
function subType(){
this.subproperty
}
subType.prototype = new superType(); // subType的原型被重新写,此刻super中的属性都变成subType原型中属性,那么superType的属性值被子类型的实例共享
subType.prototype.getSubValue = function(){
return this.subproperty;
}
var a = new subType();
alert(a.superA) ; //12
alert(a.getSuperValue); //true
这是一个原型链的继承。subType的原型被重新写,所以subype的实例就要写在他的后面。子类型可以重写超类型中的方法,也可以添加超类型中不存在的方法,但是都要放在重写原型的语句之后。
在通过原型链实现继承的情况下,搜索过程就得沿着原型继续向上:先搜索子类型的实例,再搜索子类型的原型,再搜索超类型的实例,最后搜索超类型的原型。
缺点:在创建子类型的实例情况下,不能向超类型的构造函数中传递参数;超类型中属性值被子类型实例共享。
7.2 借用构造函数
function SuperType(name){
this.name = name;
}
SuperType.prototype.sex = 1;
function SubType(name){
SuperType.call(this,name);
this.age = 29;
}
var instance = new SubType("tom");
alert(instance.name); //tom
alert(instance.sex); //undefined
缺点:在超类型的原型中定义的方法和属性对于子类型都是不可见的。
7.3 组合继承
将原型链和借用构造函数组合到一块。使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承。