摘要:在本教程中,您将学习如何使用 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 的原型链是 p1、Person.prototype 和 Object.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)由于 e1 是 Employee 类的实例,因此它也是 Person 和 Object 类的实例(基类)。
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.hasInstance 在 Function 原型上定义,因此默认情况下它在所有函数和类中自动可用
您可以将子类上的 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。