JavaScript instanceof 运算符
您将学习如何使用 JavaScript instanceof 运算符来确定构造函数的原型是否在对象的原型链
在本教程中,您将学习如何使用 JavaScript instanceof
运算符来确定构造函数的原型是否在对象的原型链。
JavaScript instanceof 操作符介绍
如果构造函数的原型 (constructor.prototype) 出现在对象的原型链中,则 instanceof 运算符返回 true。
下面显示 instanceof
运算符的语法:
object instanceof contructor
在这个语法中:
object
是要测试的对象。constructor
是一个用来测试的函数。
JavaScript instanceof 运算符示例
以下示例定义 Person
类型并使用 instanceof
运算符检查对象是否是 Person
类型的实例:
function Person(name) {
this.name = name;
}
let p1 = new Person('John');
console.log(p1 instanceof Person); // true
怎么运行的。
首先,使用构造函数模式定义一个类型 Person
:
function Person(name) {
this.name = name;
}
其次,创建 Person
类型对象 p1:
let p1 = new Person('John Doe');
第三,检查 p1 是否是 Person
类型的实例:
console.log(p1 instanceof Person); // true
它返回 true,因为 Person.prototype 出现在 p1 对象的原型链。 p1 的原型链是 p1、Person.prototype 和 Object.prototype 之间的链接:
以下也返回 true,因为 Object.prototype 出现在 p1 对象的原型链:
console.log(p1 instanceof Object); // true
ES6 类和 instanceof 运算符
以下示例定义 Person
类并使用 instanceof
运算符检查对象是否是 Person
类的实例:
class Person {
constructor(name) {
this.name = name;
}
}
let p1 = new Person('John');
console.log(p1 instanceof Person); // true
怎么运行的。
首先,定义 Person
类:
class Person {
constructor(name) {
this.name = name;
}
}
其次,创建 Person
类的实例:
let p1 = new Person('John');
第三,检查p1
是否是 Person
类的实例:
console.log(p1 instanceof Person); // true
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
由于 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
由于 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
结论
- 使用
instanceof
运算符检查constructor.protoype
是否在对象的原型链。