JavaScript: 原型链与继承

作者 Lei Zhang 日期 2018-12-18
JavaScript: 原型链与继承

原型链的基本思想是:利用原型让一个引用类型继承另一个引用类型的属性和方法。

重写或添加方法的正确写法:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function () {
return this.property;
}
function SubType() {
this.subproperty = false;
}
//继承了SuperType
SubType.prototype = new SuperType();
//添加新方法
SubType.prototype.getSubValue = function () {
return this.subproperty;
}
//重写超类中的方法
SubType.prototype.getSuperValue = function () {
return false;
}

var instance = new SubType();
alert(instance.getSuperValue()); //false

此例达成的效果是,当通过 SubType 的实例调用 getSuperValue() 时,调用的是重写的新方法;而通过 SuperType 的实例调用 getSuperValue() 时,还会继续调用原来的方法。

需要注意的是,必须在用 SuperType 的实例替换原型之后(SubType.prototype = new SuperType()),在定义这两个方法。

在通过原型链实现继承时,不能使用对象字面量创建原型方法,否则会重写原型链,如下:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function () {
return this.property;
}
function SubType() {
this.subproperty = false;
}
//继承了SuperType
SubType.prototype = new SuperType();
//使用字面量添加新方法,会导致上一行代码无效
SubType.prototype = {
getSubValue : function (){
return this.subproperty;
},
someOtherMethod : function (){
return false;
}
}

var instance = new SubType();
alert(instance.getSuperValue()); //error!

以上代码刚刚把 SuperType 的实例赋值给原型,紧接着又将原型替换成一个对象字面量而导致问题。现在的原型包含的是一个 Object 的实例,而非 SuperType 实例,因此原型链已经切断——SubType 和 SuperType 之间已经没有关系了。