根据克罗克福德的定义:
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
。是否有理由将其限制为新对象而不是现有对象?
答案 0 :(得分:2)
根据MDN __proto__
条目,ES6将允许分配对象的[[Prototype]]
。该文章此前(自2010年10月起)表示该物业已被弃用。它可能还需要几年时间才能在网络上发挥作用,特别是因为在不支持它的浏览器中很难实现它。
我希望__proto__
属性对于内置对象和拥有它的主机对象是只读的。
你必须要问Brendan Eich为什么隐藏[[Prototype]]
属性并且只能通过构造函数设置,但我怀疑他想保持JavaScript简单并且不允许发布的滥用eval
。
至于Crockford的beget
,它首先由Lasse Reichstein Nielsen以clone
的形式发布,作为克隆对象的一种方式,后来被ES5 Object.create取代。
答案 1 :(得分:1)
我可以看到的一个原因是避免循环引用的可能性。