Symbol.hasInstance
Symbol.hasInstance
静态数据属性代表 众所周知的符号 Symbol.hasInstance
。 instanceof
运算符在它的右操作数上查找此符号,以获取用于确定构造函数对象是否识别一个对象为其实例的方法。
试试看
值
众所周知的符号 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 语言规范 # sec-symbol.hasinstance |
浏览器兼容性
BCD 表格仅在浏览器中加载