繁体   English   中英

将__proto__用作由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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM