`__proto__`可以安全地用作使用`Object.create(null)`创建的对象的属性名吗?

时间:2014-03-19 16:32:41

标签: javascript object dictionary properties prototype

这个问题的上下文是实现字典,这些字典对可以放置哪些键没有限制(并且没有有趣的行为)。

当然,如果您使用从Object.prototype继承的对象,如果您尝试设置__proto__,则可以获得funny behavior

所以问题是,如果你创建一个不从Object.prototype继承的对象,那么__proto__属性是否有任何特殊之处,并且使用它与任何其他属性名称一样安全?例如,在我的浏览器上__proto__似乎对“普通”对象“不安全”,但在Object.create(null)个对象上“安全”:

var normal = {};
Object.getPrototypeOf(normal) !== Array.prototype
normal['__proto__'] = Array.prototype;
Object.getPrototypeOf(normal) === Array.prototype // prototype **is** changed

var odd = Object.create(null);
Object.getPrototypeOf(odd) === null
odd['__proto__'] = Array.prototype;
Object.getPrototypeOf(odd) === null // prototype **not** changed

为了让我更加困惑,this字典库使用Object.create(null),但也会通过添加~来修改密钥。这是否意味着在实现中使用Object.create(null)创建的对象中的任意键是不安全的?

1 个答案:

答案 0 :(得分:1)

由于我recently learnt__proto__本身并不属于特殊财产;相反,__proto__原型的Object属性是,并且通过扩展,任何对象的__proto__属性最终从Obejct原型继承它。由于使用Object.create(null)创建的对象不是这种情况,__proto__就像它们的任何其他属性一样。 (正如上面链接的问题中的示例所示,对于最初从Object继承的对象,也可以通过myObejct.__proto__ = null将其与原型链断开来实现。)