为什么 __proto__ 周围的方括号使其在对象中可枚举
Why do square brackets around __proto__ makes it enumerable in an object
在对象中使用 __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__
的正常字符串值是允许的:
- If propKey is the String value
__proto__
and if IsComputedPropertyKey(PropertyName) is false, then
a. Let isProtoSetter be true.
- Else,
a. Let isProtoSetter be false.
isProtoSetter
标志为真时,表示创建的对象应该具有与该键配对的值的内部原型。对象的标准内部原型的 __proto__
不可枚举 - 它存在于 Object.prototype
:
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
当为 false 时,相当于有一个 plain 属性 被命名为 __proto__
,并且对象初始化器中的 plain 属性变得可枚举。
在对象中使用 __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__
的正常字符串值是允许的:
- If propKey is the String value
__proto__
and if IsComputedPropertyKey(PropertyName) is false, then
a. Let isProtoSetter be true.
- Else,
a. Let isProtoSetter be false.
isProtoSetter
标志为真时,表示创建的对象应该具有与该键配对的值的内部原型。对象的标准内部原型的 __proto__
不可枚举 - 它存在于 Object.prototype
:
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
当为 false 时,相当于有一个 plain 属性 被命名为 __proto__
,并且对象初始化器中的 plain 属性变得可枚举。