我看到了两种不同的模式和解释。一个来自DailyJS和许多其他人: Rectangle.prototype = new Shape();
然后是Crockford的 here ,这意味着 Rectangle.prototype = Shape;
现在从理论上来说,为什么你需要运行'新'?它运行构造函数,是的。它还为Rectangle的原型分配了Shape的原型。但是我们应该能够通过简单地将父项分配到原型中来进行继承。
我想知道原因是否是原型链接。看来,在案例1中,它将创建一个原型链。这意味着,Rectangle原型将具有Shape 原型。 在第二种情况下,Rectangle的原型将只有Shape的方法 - 但不是Shape的原型方法。
是吗?非常感谢任何想法。
答案 0 :(得分:4)
Crockford仅表示
Rectangle.prototype = Shape;
我真的看不到。
现在从理论上来说,为什么你需要运行'新'?它运行构造函数,是的。
然而,我们实际上并不需要(想要),我们只需要Shape.prototype
的继承
它还为Rectangle的原型分配了Shape的原型。
不是真的。 new Shape
创建一个新对象,它继承自Shape.prototype
,这才是我们的重点。你做对了。
在第二种情况下,Rectangle的原型只有Shape的方法 - 而不是Shape的原型方法。
是的,这是正确的。您应该从Shape.prototype
继承 - 但必须通过Object.create(Shape.prototype)
继承,而不是通过创建实例。请参阅JavaScript inheritance: Object.create vs new或What is the reason [not] to use the 'new' keyword here?。这就是Crockford实际上做的事情 - 甚至在EcmaScript 5.1引入Object.create
之前,他找到了一个聪明的方法来实现他的帮助函数
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
现在是本地不支持它的浏览器中Object.create
的常见填充程序。