摘要:在本教程中,您将学习如何使用 JavaScript instanceof
运算符来确定构造函数的原型是否出现在对象的原型链中。
JavaScript instanceof 运算符简介
如果构造函数(constructor.prototype
)的 原型 出现在对象的原型链中,则 instanceof
运算符将返回 true
。
以下显示了 instanceof
运算符的语法
object instanceof contructor
Code 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); // true
Code 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); // true
Code language: JavaScript (javascript)
它返回 true
,因为 Person.prototype
出现在 p1
对象的原型链上。p1
的原型链是 p1
、Person.prototype
和 Object.prototype
之间的链接
以下也返回 true
,因为 Object.prototype
出现在 p1
对象的原型链上
console.log(p1 instanceof Object); // true
Code 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); // true
Code 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); // true
Code 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)); // true
Code 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); // false
Code language: JavaScript (javascript)
总结
- 使用
instanceof
运算符检查对象原型链中的constructor.protoype
。