Symbol.hasInstance
Symbol.hasInstance 靜態資料屬性表示 知名 Symbol Symbol.hasInstance。 instanceof 運算子在其右側運算元上查詢此 Symbol,以獲取用於確定建構函式物件是否識別某個物件作為其例項的方法。
試一試
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1);
// Expected output: true
值
知名 Symbol Symbol.hasInstance。
Symbol.hasInstance 的屬性特性 | |
|---|---|
| 可寫 | 否 |
| 可列舉 | 否 |
| 可配置 | 否 |
描述
instanceof 運算子使用以下演算法來計算 object instanceof constructor 的返回值
- 如果
constructor具有[Symbol.hasInstance]()方法,則使用object作為第一個引數呼叫該方法,並返回結果,該結果將被 強制轉換為布林值。如果constructor不是物件,或者constructor[Symbol.hasInstance]不是null、undefined或函式,則丟擲TypeError。 - 否則,如果
constructor沒有[Symbol.hasInstance]()方法(constructor[Symbol.hasInstance]為null或undefined),則使用與Function.prototype[Symbol.hasInstance]()相同的演算法來確定結果。如果constructor不是函式,則丟擲TypeError。
由於預設情況下所有函式都繼承自 Function.prototype,因此在大多數情況下,當右側為函式時,Function.prototype[Symbol.hasInstance]() 方法會指定 instanceof 的行為。
示例
自定義 instanceof 行為
例如,你可以像這樣實現自定義的 instanceof 行為
js
class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof MyArray); // true
js
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
value(instance) {
return Array.isArray(instance);
},
});
console.log([] instanceof MyArray); // true
檢查物件的例項
就像可以使用 instanceof 關鍵字檢查物件是否為類的例項一樣,我們也可以使用 Symbol.hasInstance 進行此類檢查。
js
class Animal {
constructor() {}
}
const cat = new Animal();
console.log(Animal[Symbol.hasInstance](cat)); // true
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-symbol.hasinstance |
瀏覽器相容性
載入中…