📅  最后修改于: 2023-12-03 14:42:27.345000             🧑  作者: Mango
在 JavaScript 中,每个对象都有 [[Prototype]] 隐式属性,它指向它的原型对象。原型对象同样也可以有其他的原型对象,以此类推,形成原型链。
当我们使用 instanceof
操作符检查一个值是否为某个构造函数的实例时,实际上是会沿着原型链查找,判断值的原型对象是否为该构造函数的原型对象或者其子孙原型对象。
JavaScript 中还有一种特殊的对象属性:Symbol.hasInstance,它是一个用来定制 instanceof
行为的标准内置 Symbol 值。
Function[Symbol.hasInstance](value);
value
:要检查的值。返回一个布尔值,指示当前对象是否是参数的实例。
我们可以使用 Symbol.hasInstance 属性来自定义 instanceof
的判断逻辑。
举个例子,如果我们有一个类 Person,那么默认情况下,如果一个值 a 是该类的实例,那么 a instanceof Person
将返回 true。但是,我们可以利用 Symbol.hasInstance 属性,定义一个新的类 Teacher 或任何类型,用于判断一个值是否为 Person 的子类,而不仅仅是 Person 的实例。
class Person {}
class Teacher {
static [Symbol.hasInstance](instance) {
return instance instanceof Person;
}
}
const p = new Person();
const t = new Teacher();
console.log(p instanceof Person); // true
console.log(t instanceof Teacher); // true
console.log(t instanceof Person); // true,因为 Teacher 的 hasInstance 方法返回了 true
Symbol.hasInstance 属性提供了一种有效的方式来自定义 instanceof 操作符的行为。尽管在实际应用中使用得不会很多,但是了解它的作用还是很有帮助的。同时,本文还介绍了原型对象、原型链等基础概念,这些概念是理解 Symbol.hasInstance 属性的先决条件。