首页 > 解决方案 > 为什么 __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__

我知道使用方括号计算属性名称,但我不明白为什么一个可以枚举而另一个不能。

标签: javascriptprototype-programmingprototype-chain

解决方案


在规范中有所描述。计算属性名称 of__proto__明确排除在检查之外,而允许isProtoSetter正常字符串值 of :__proto__

  1. 如果 propKey 是 String 值__proto__ 并且 IsComputedPropertyKey(PropertyName) 是 false,那么

一种。让 isProtoSetter 为真。

  1. 别的,

一种。让 isProtoSetter 为假。

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

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

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


推荐阅读