Function.prototype[Symbol.hasInstance]()

Baseline 已廣泛支援

該特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 2017 年 4 月以來,它已在各大瀏覽器上可用。

[Symbol.hasInstance]() 方法是 Function 例項的一個方法,它指定了建構函式如何預設識別一個物件是否為該建構函式例項的。它由 instanceof 運算子呼叫。

語法

js
func[Symbol.hasInstance](value)

引數

value

要測試的物件。原始值始終返回 false

返回值

如果 func.prototype 存在於 value 的原型鏈中,則返回 true;否則返回 false。如果 value 不是物件或者 this 不是函式,則始終返回 false。如果 this 是一個 繫結函式,則返回 value 和底層目標函式之間的 instanceof 測試結果。

異常

TypeError

如果 this 不是繫結函式且 this.prototype 不是物件,則會丟擲錯誤。

描述

每當右側存在 [Symbol.hasInstance]() 方法時,instanceof 運算子就會呼叫它。由於所有函式預設都繼承自 Function.prototype,因此它們都將具有 [Symbol.hasInstance]() 方法,所以在大多數情況下,Function.prototype[Symbol.hasInstance]() 方法會指定 instanceof 在右側為函式時的行為。此方法實現了 instanceof 運算子的預設行為(即當 constructor 沒有 [Symbol.hasInstance]() 方法時的演算法)。

與大多數方法不同,Function.prototype[Symbol.hasInstance]() 屬性是不可配置且不可寫的。這是一項安全功能,用於防止獲取繫結函式的底層目標函式。有關示例,請參閱 此 Stack Overflow 回答

示例

恢復預設的 instanceof 行為

您很少需要直接呼叫此方法。相反,此方法由 instanceof 運算子呼叫。您應該期望這兩個結果通常是等效的。

js
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true

如果您想呼叫預設的 instanceof 行為,但又不知道建構函式是否已重寫了 [Symbol.hasInstance]() 方法,您可能想使用此方法。

js
class Foo {
  static [Symbol.hasInstance](value) {
    // A custom implementation
    return false;
  }
}

const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true

規範

規範
ECMAScript® 2026 語言規範
# sec-function.prototype-%symbol.hasinstance%

瀏覽器相容性

另見