SyntaxError: property name __proto__ appears more than once in object literal

当一个对象字面量包含多个 __proto__ 字段时,会发生 JavaScript 异常“属性名 __proto__ 在对象字面量中出现多次”,该字段用于设置这个新对象的原型

消息

SyntaxError: Duplicate __proto__ fields are not allowed in object literals (V8-based)
SyntaxError: property name __proto__ appears more than once in object literal (Firefox)
SyntaxError: Attempted to redefine __proto__ property. (Safari)

错误类型

SyntaxError

哪里出错了?

__proto__ 键与其他属性键不同,它在对象字面量中是一种特殊的语法。它用于设置正在创建的对象的原型,并且不允许在一个对象字面量中出现多次。请注意,此限制仅适用于 __proto__ 原型设置器语法:如果它实际上具有创建名为 __proto__ 的属性的效果,那么它可以出现多次。有关确切的语法限制,请参阅原型设置器

值得注意的是,对象字面量中的 __proto__ 键是一种特殊语法,并未被弃用,这与Object.prototype.__proto__ 访问器属性不同。

示例

无效案例

js
const obj = { __proto__: {}, __proto__: { a: 1 } };

有效情况

js
// Only setting the prototype once
const obj = { __proto__: { a: 1 } };

// These syntaxes all create a property called "__proto__" and can coexist
// They would overwrite each other and the last one is actually used
const __proto__ = null;
const obj2 = {
  ["__proto__"]: {},
  __proto__,
  __proto__() {},
  get __proto__() {
    return 1;
  },
};

另见