在Javascript中,为什么我们不能任意设置原型继承?

时间:2012-10-02 22:56:49

标签: javascript prototypal-inheritance

根据克罗克福德的定义:

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。是否有理由将其限制为新对象而不是现有对象?

2 个答案:

答案 0 :(得分:2)

根据MDN __proto__条目,ES6将允许分配对象的[[Prototype]]。该文章此前(自2010年10月起)表示该物业已被弃用。它可能还需要几年时间才能在网络上发挥作用,特别是因为在不支持它的浏览器中很难实现它。

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

你必须要问Brendan Eich为什么隐藏[[Prototype]]属性并且只能通过构造函数设置,但我怀疑他想保持JavaScript简单并且不允许发布的滥用eval

至于Crockford的beget,它首先由Lasse Reichstein Nielsenclone的形式发布,作为克隆对象的一种方式,后来被ES5 Object.create取代。

答案 1 :(得分:1)

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