Symbol.hasInstance

Baseline 已廣泛支援

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

Symbol.hasInstance 靜態資料屬性表示 知名 Symbol Symbol.hasInstanceinstanceof 運算子在其右側運算元上查詢此 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 的返回值

  1. 如果 constructor 具有 [Symbol.hasInstance]() 方法,則使用 object 作為第一個引數呼叫該方法,並返回結果,該結果將被 強制轉換為布林值。如果 constructor 不是物件,或者 constructor[Symbol.hasInstance] 不是 nullundefined 或函式,則丟擲 TypeError
  2. 否則,如果 constructor 沒有 [Symbol.hasInstance]() 方法(constructor[Symbol.hasInstance]nullundefined),則使用與 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

瀏覽器相容性

另見