这个问题的上下文是实现字典,这些字典对可以放置哪些键没有限制(并且没有有趣的行为)。
当然,如果您使用从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)
创建的对象中的任意键是不安全的?
答案 0 :(得分:1)
由于我recently learnt,__proto__
本身并不属于特殊财产;相反,__proto__
原型的Object
属性是,并且通过扩展,任何对象的__proto__
属性最终从Obejct
原型继承它。由于使用Object.create(null)
创建的对象不是这种情况,__proto__
就像它们的任何其他属性一样。 (正如上面链接的问题中的示例所示,对于最初从Object
继承的对象,也可以通过myObejct.__proto__ = null
将其与原型链断开来实现。)