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 |
浏览器兼容性
加载中…