SyntaxError: 对象字面量中 __proto__ 属性名出现多次

当一个对象字面量包含多次出现__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)

错误类型

哪里出错了?

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

值得注意的是,对象字面量中的__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__() {},
};

另请参阅