Function.prototype[Symbol.hasInstance]()

[Symbol.hasInstance]() 方法是 Function 实例的方法,它指定了用于确定构造函数是否识别某个对象为其实例的默认过程。它由 instanceof 运算符调用。

语法

js
func[Symbol.hasInstance](value)

参数

value

要测试的对象。原始值始终返回 false

返回值

如果 func.prototypevalue 的原型链中,则返回 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 运算符调用。您应该期望这两个结果通常是等效的。

js
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true

如果您想调用默认的 instanceof 行为,但您不知道构造函数是否具有重写后的 [Symbol.hasInstance]() 方法,则可以使用此方法。

js
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 的浏览器中加载。

另请参阅