Function.prototype[Symbol.hasInstance]()
[Symbol.hasInstance]() 方法是 例項的一個方法,它指定了建構函式如何預設識別一個物件是否為該建構函式例項的。它由 Function 運算子呼叫。instanceof
語法
func[Symbol.hasInstance](value)
引數
value-
要測試的物件。原始值始終返回
false。
返回值
如果 func.prototype 存在於 value 的原型鏈中,則返回 true;否則返回 false。如果 value 不是物件或者 this 不是函式,則始終返回 false。如果 this 是一個 繫結函式,則返回 value 和底層目標函式之間的 instanceof 測試結果。
異常
TypeError-
如果
this不是繫結函式且this.prototype不是物件,則會丟擲錯誤。
描述
每當右側存在 方法時,[Symbol.hasInstance]() 運算子就會呼叫它。由於所有函式預設都繼承自 instanceofFunction.prototype,因此它們都將具有 [Symbol.hasInstance]() 方法,所以在大多數情況下,Function.prototype[Symbol.hasInstance]() 方法會指定 instanceof 在右側為函式時的行為。此方法實現了 instanceof 運算子的預設行為(即當 constructor 沒有 [Symbol.hasInstance]() 方法時的演算法)。
與大多數方法不同,Function.prototype[Symbol.hasInstance]() 屬性是不可配置且不可寫的。這是一項安全功能,用於防止獲取繫結函式的底層目標函式。有關示例,請參閱 此 Stack Overflow 回答。
示例
恢復預設的 instanceof 行為
您很少需要直接呼叫此方法。相反,此方法由 instanceof 運算子呼叫。您應該期望這兩個結果通常是等效的。
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
如果您想呼叫預設的 instanceof 行為,但又不知道建構函式是否已重寫了 [Symbol.hasInstance]() 方法,您可能想使用此方法。
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% |
瀏覽器相容性
載入中…