JavaScript instanceof

摘要:在本教程中,您将学习如何使用 JavaScript instanceof 运算符来确定构造函数的原型是否出现在对象的原型链中。

JavaScript instanceof 运算符简介

如果构造函数(constructor.prototype)的 原型 出现在对象的原型链中,则 instanceof 运算符将返回 true

以下显示了 instanceof 运算符的语法

object instanceof contructorCode language: JavaScript (javascript)

在此语法中

  • object 是要测试的对象。
  • constructor 是要测试的函数。

JavaScript instanceof 运算符示例

以下示例定义了 Person 类型,并使用 instanceof 运算符来检查对象是否是该类型的实例

function Person(name) {
  this.name = name;
}

let p1 = new Person('John');

console.log(p1 instanceof Person); // trueCode language: JavaScript (javascript)

它是如何工作的。

首先,使用 构造函数 模式定义 Person 类型

function Person(name) {
  this.name = name;
}Code language: JavaScript (javascript)

其次,创建一个 Person 类型的新的对象

let p1 = new Person('John Doe');Code language: JavaScript (javascript)

第三,检查 person 是否是 Person 类型的实例

console.log(p1 instanceof Person); // trueCode language: JavaScript (javascript)

它返回 true,因为 Person.prototype 出现在 p1 对象的原型链上。p1 的原型链是 p1Person.prototypeObject.prototype 之间的链接

以下也返回 true,因为 Object.prototype 出现在 p1 对象的原型链上

console.log(p1 instanceof Object); // trueCode language: JavaScript (javascript)

ES6 类和 instanceof 运算符

以下示例定义了 Person 类,并使用 instanceof 运算符来检查对象是否是 的实例

class Person {
  constructor(name) {
    this.name = name;
  }
}

let p1 = new Person('John');

console.log(p1 instanceof Person); // true
Code language: JavaScript (javascript)

它是如何工作的。

首先,定义 Person

class Person {
  constructor(name) {
    this.name = name;
  }
}Code language: JavaScript (javascript)

其次,创建一个 Person 类的新的实例

let p1 = new Person('John');Code language: JavaScript (javascript)

第三,检查 p1 是否是 Person 类的实例

console.log(p1 instanceof Person); // trueCode language: JavaScript (javascript)

instanceof 运算符和继承

以下示例定义了 Employee 类,该类扩展了 Person

class Person {
  constructor(name) {
    this.name = name;
  }
}

class Employee extends Person {
  constructor(name, title) {
    super(name);
    this.title = title;
  }
}

let e1 = new Employee();

console.log(e1 instanceof Employee); // true
console.log(e1 instanceof Person); // true
console.log(e1 instanceof Object); // trueCode language: JavaScript (javascript)

由于 e1Employee 类的实例,因此它也是 PersonObject 类的实例(基类)。

Symbol.hasInstance

在 ES6 中,instanceof 运算符使用 Symbol.hasInstance 函数来检查关系。Symbol.hasInstance() 接受一个对象,如果类型具有该对象作为实例,则返回 true。例如

class Person {
  constructor(name) {
    this.name = name;
  }
}

let p1 = new Person('John');

console.log(Person[Symbol.hasInstance](p1)); // trueCode language: JavaScript (javascript)

由于 Symbol.hasInstanceFunction 原型上定义,因此默认情况下它在所有函数和类中自动可用

您可以将子类上的 Symbol.hasInstance 重新定义为静态方法。例如

class Person {
  constructor(name) {
    this.name = name;
  }
}

class Android extends Person {
  static [Symbol.hasInstance]() {
    return false;
  }
}

let a1 = new Android('Sonny');

console.log(a1 instanceof Android); // false
console.log(a1 instanceof Person); // falseCode language: JavaScript (javascript)

总结

  • 使用 instanceof 运算符检查对象原型链中的 constructor.protoype
本教程对您有帮助吗?