javascript原型链:Rectangle.prototype = new Shape()或Rectangle.prototype = Shape?

时间:2012-10-26 14:51:47

标签: javascript inheritance prototype

我看到了两种不同的模式和解释。一个来自DailyJS和许多其他人: Rectangle.prototype = new Shape();

然后是Crockford的 here ,这意味着  Rectangle.prototype = Shape;

现在从理论上来说,为什么你需要运行'新'?它运行构造函数,是的。它还为Rectangle的原型分配了Shape的原型。但是我们应该能够通过简单地将父项分配到原型中来进行继承。

我想知道原因是否是原型链接。看来,在案例1中,它将创建一个原型。这意味着,Rectangle原型将具有Shape 原型。 在第二种情况下,Rectangle的原型将只有Shape的方法 - 但不是Shape的原型方法。

是吗?非常感谢任何想法。

1 个答案:

答案 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 newWhat 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的常见填充程序。