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

浏览器兼容性

另见