В этом руководстве вы узнаете, как использовать оператор 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