Оператор instanceof в JavaScript: проверка класса

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

Оператор instanceof в JavaScript

Следующий код также возвращает 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
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript