根据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取代。
我能看到的一个原因是避免循环引用的可能性。