В этом руководстве вы узнаете, как использовать оператор instanceof JavaScript для проверки класса, чтобы определить, появляется ли прототип конструктора в цепочке прототипов объекта.
Оператор instanceof возвращает значение true, если прототип конструктора( constructor.prototype ) появляется в цепочке прототипов object.
Синтаксис:
object instanceof contructor
В этом синтаксисе:
object— это объект для тестирования.constructor— это функция для тестирования.
Пример
В следующем примере определяется тип Person и используется оператор instanceof для проверки, является ли объект экземпляром этого типа:
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:
let p1 = new Person('John Doe');- В-третьих, проверьте, является ли
personэкземпляром типа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 для проверки того, является ли объект экземпляром класса:
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