微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 __proto__ 周围的方括号使它在对象中可枚举

如何解决为什么 __proto__ 周围的方括号使它在对象中可枚举

在对象中使用方括号 __proto__ 时,__proto__ 是可枚举的。如果未提供方括号,则 __proto__ 不可枚举。

示例:

obj = {"__proto__": "Hello"}
for (var k in obj)
{
    console.log(k)
};
// No Output

使用方括号

obj = {["__proto__"]: "Hello"}
for (var k in obj)
{
    console.log(k)
};
// Output:
// __proto__

我理解使用方括号 computed property names,但我不明白为什么一个可以枚举而另一个不能。

解决方法

这被描述为in the specification__proto__ 的计算属性名称​​从 isProtoSetter 检查中特别排除,而 __proto__ 的正常字符串值是允许的:

  1. 如果 propKey 是字符串值 __proto__ 并且如果 IsComputedPropertyKey(PropertyName) 是 false,则

一个。让 isProtoSetter 为真。

  1. 否则,

一个。让 isProtoSetter 为假。

isProtoSetter 标志为 true 时,表示创建的对象应该具有与该键配对的值的内部原型。对象的标准内部原型的 __proto__ 不可枚举 - 它存在于 Object.prototype:

console.log(Object.getOwnPropertyDescriptor(Object.prototype,'__proto__'));

当为 false 时,它​​相当于拥有一个名为 __proto__plain 属性,并且对象初始值设定项中的普通属性变为可枚举的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。