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



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

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

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

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

至于克罗克福德的beget,它最初是由Lasse Reichstein Nielsen作为克隆对象的一种方式clone出版的,后来被ES5 Object.create取代。

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

相关内容

最新更新