Function.prototype[Symbol.hasInstance]()

Baseline 已广泛支持

该特性已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 4 月以来,它已在各大浏览器上可用。

[Symbol.hasInstance]() 方法是 Function 实例的一个方法,它指定了构造函数如何默认识别一个对象是否为该构造函数实例的。它由 instanceof 操作符调用。

语法

js
func[Symbol.hasInstance](value)

参数

value

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

返回值

如果 func.prototype 存在于 value 的原型链中,则返回 true;否则返回 false。如果 value 不是对象或者 this 不是函数,则始终返回 false。如果 this 是一个 绑定函数,则返回 value 和底层目标函数之间的 instanceof 测试结果。

异常

TypeError

如果 this 不是绑定函数且 this.prototype 不是对象,则会抛出错误。

描述

每当右侧存在 [Symbol.hasInstance]() 方法时,instanceof 操作符就会调用它。由于所有函数默认都继承自 Function.prototype,因此它们都将具有 [Symbol.hasInstance]() 方法,所以在大多数情况下,Function.prototype[Symbol.hasInstance]() 方法会指定 instanceof 在右侧为函数时的行为。此方法实现了 instanceof 操作符的默认行为(即当 constructor 没有 [Symbol.hasInstance]() 方法时的算法)。

与大多数方法不同,Function.prototype[Symbol.hasInstance]() 属性是不可配置且不可写的。这是一项安全功能,用于防止获取绑定函数的底层目标函数。有关示例,请参阅 此 Stack Overflow 回答

示例

恢复默认的 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® 2026 语言规范
# sec-function.prototype-%symbol.hasinstance%

浏览器兼容性

另见