![](/img/trans.png)
[英]How does __proto__ work when object is created with Object.create(null)
[英]Is `__proto__` safe to use as a property name for objects created using `Object.create(null)`?
这个问题的上下文是实现字典,该字典对可以在其中放置哪些键没有限制(也没有有趣的行为)。
当然,如果使用继承自Object.prototype
对象,则尝试设置__proto__
,则会得到有趣的行为 。
因此,问题是,如果您创建的对象不继承自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
让我更加困惑的是, 这个字典库使用Object.create(null)
,但也通过在~
前面加上键来修饰键。 这是否意味着在整个实现中,在使用Object.create(null)
创建的对象中使用任意键通常并不安全?
据我最近了解 , __proto__
本身并不是一种特殊的财产。 而是Object
原型的__proto__
属性,并且通过扩展,最终从Obejct
原型继承它的任何对象的__proto__
属性。 由于使用Object.create(null)
创建的对象不是这种情况, __proto__
就像它们的任何其他属性一样。 (并且正如上面链接的问题中的示例所示,通过使用myObejct.__proto__ = null
断开它们与原型链的连接,也可以实现最初从Object
继承的Object
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.