使用“__proto__”作为使用“Object.create(null)”创建的对象的属性名称是否安全?

2023-12-15

这个问题的背景是实现字典,对可以放置在其中的键没有限制(并且没有有趣的行为)。

当然,如果您使用继承自的对象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

让我更加困惑的是,this词典库用途Object.create(null),但也会通过在前面添加一个来破坏键~。这是否意味着通常在跨实现中,在使用以下命令创建的对象中使用任意键是不安全的Object.create(null)?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“__proto__”作为使用“Object.create(null)”创建的对象的属性名称是否安全? 的相关文章

随机推荐