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;
  },
};

另見