5

根据 Crockford 的定义:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

和 ECMA-262 的引入Object.create(),我们现在可以设置一个新对象a的隐藏原型属性来指向另一个对象b进行纯原型继承。但它仅限于一个新对象,并且 Javascript 仍然不允许类似的东西

a.__proto__ = b;

对于 ECMA-262 Javascript 规范中的现有对象a。是否有理由将其限制为新对象而不是现有对象?

4

2 回答 2

2

根据MDN__proto__条目,ES6 将允许分配给对象的[[Prototype]]. 之前的文章(自 2010 年 10 月以来)说该属性已被弃用。可能还需要几年时间才能在网络上使用它,特别是因为在不支持它的浏览器中很难稳健地实现。

我希望该__proto__属性对于内置对象和拥有它的宿主对象是只读的。

您将不得不问 Brendan Eich 为什么该[[Prototype]]属性被隐藏并且只能通过构造函数进行设置,但我怀疑他希望保持 JavaScript 简单并且不允许滥用eval.

至于 Crockford 的beget,它最初是cloneLasse Reichstein Nielsen作为克隆对象的一种方式发布的,后来被 ES5 Object.create取代。

于 2012-10-03T01:17:09.390 回答
1

我能看到的一个原因是避免循环引用的可能性。

于 2012-10-02T23:01:46.830 回答