Function.prototype[Symbol.hasInstance]()
[Symbol.hasInstance]()
方法是 Function
实例的方法,它指定了用于确定构造函数是否识别某个对象为其实例的默认过程。它由 instanceof
运算符调用。
语法
func[Symbol.hasInstance](value)
参数
value
-
要测试的对象。原始值始终返回
false
。
返回值
如果 func.prototype
在 value
的原型链中,则返回 true
;否则返回 false
。如果 value
不是对象或 this
不是函数,则始终返回 false
。如果 this
是一个 绑定函数,则返回对 value
和底层目标函数进行 instanceof
测试的结果。
异常
TypeError
-
如果
this
不是绑定函数并且this.prototype
不是对象,则抛出。
描述
instanceof
运算符在存在此方法时,调用右侧方法的 [Symbol.hasInstance]()
方法。由于所有函数默认都从 Function.prototype
继承,因此它们都将具有 [Symbol.hasInstance]()
方法,所以大多数情况下,Function.prototype[Symbol.hasInstance]()
方法指定了右侧为函数时 instanceof
的行为。此方法实现了 instanceof
运算符的默认行为(当 constructor
没有 [Symbol.hasInstance]()
方法时相同的算法)。
与大多数方法不同,Function.prototype[Symbol.hasInstance]()
属性不可配置且不可写入。这是为了防止获取绑定函数的底层目标函数的安全特性。请参阅 此 StackOverflow 答案以获取示例。
示例
恢复默认 instanceof 行为
您很少需要直接调用此方法。相反,此方法由 instanceof
运算符调用。您应该期望这两个结果通常是等效的。
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
如果您想调用默认的 instanceof
行为,但您不知道构造函数是否具有重写后的 [Symbol.hasInstance]()
方法,则可以使用此方法。
class Foo {
static [Symbol.hasInstance](value) {
// A custom implementation
return false;
}
}
const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true
规范
规范 |
---|
ECMAScript 语言规范 # sec-function.prototype-%symbol.hasinstance% |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。