【问题标题】:Why do square brackets around __proto__ makes it enumerable in an object为什么 __proto__ 周围的方括号使它在对象中可枚举
【发布时间】:2021-03-09 23:11:11
【问题描述】:

当在对象中的__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,但我不明白为什么一个可以枚举而另一个不能。

【问题讨论】:

    标签: javascript prototype-programming prototype-chain


    【解决方案1】:

    这被描述为in the specification__proto__ 的计算属性名称​​明确排除isProtoSetter 检查,而__proto__ 的普通字符串值是允许的:

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

    一个。让 isProtoSetter 为真。

    1. 否则,

    一个。让 isProtoSetter 为假。

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

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

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

    【讨论】:

    • 其中一个案例是规范中的注释会很好地说明“为什么?!” ...可能是“向后兼容”
    • 我使用console.log(Object.getOwnPropertyDescriptor({["__proto__"]: "hello"}, '__proto__')); 来确认这一点。它确实表明它是可枚举的。而console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__')); 不是
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2016-09-16
    • 2016-06-04
    • 2016-04-22
    • 2023-03-19
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多