原型链的基本思想是:利用原型让一个引用类型继承另一个引用类型的属性和方法。
重写或添加方法的正确写法:
function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function () { return this.property; } function SubType() { this.subproperty = false; }
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function () { return this.subproperty; }
SubType.prototype.getSuperValue = function () { return false; }
var instance = new SubType(); alert(instance.getSuperValue());
|
此例达成的效果是,当通过 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; }
SubType.prototype = new SuperType();
SubType.prototype = { getSubValue : function (){ return this.subproperty; }, someOtherMethod : function (){ return false; } }
var instance = new SubType(); alert(instance.getSuperValue());
|
以上代码刚刚把 SuperType 的实例赋值给原型,紧接着又将原型替换成一个对象字面量而导致问题。现在的原型包含的是一个 Object 的实例,而非 SuperType 实例,因此原型链已经切断——SubType 和 SuperType 之间已经没有关系了。