0

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

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

现在从理论上讲,为什么需要运行“新”?它运行构造函数,是的。它还将矩形的原型分配给形状的原型。但是我们应该能够通过简单地将父代分配到原型中来进行继承。

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

那正确吗?非常感谢您的任何想法。

4

1 回答 1

4

克罗克福德,这意味着只是Rectangle.prototype = Shape;

我真的看不出来。

现在从理论上讲,为什么需要运行“新”?它运行构造函数,是的。

然而我们实际上并不需要(想要)那个,我们只需要从Shape.prototype

它还将矩形的原型分配给形状的原型。

并不真地。new Shape创建一个继承自的新对象Shape.prototype,这对我们来说很重要。你说得对。

在第二种情况下,矩形的原型将只有 Shape 的方法——但没有 Shape 的原型方法。

对,那是正确的。您应该继承自Shape.prototype- 但 via Object.create(Shape.prototype),而不是通过创建实例。请参阅JavaScript 继承:Object.create vs newWhat is the reason [not] to use the 'new' keyword here?. 这就是 Crockford 实际所做的——甚至在Object.createEcmaScript 5.1 引入之前,他就找到了一种巧妙的方法来使用他的辅助函数来做到这一点

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

这现在是Object.create本机不支持它的浏览器中的常见填充程序。

于 2012-10-26T14:54:44.693 回答