Перевірка на екземпляр класу
1. Оператор instanceof: основний спосіб
class User {}
const u = new User();
console.log(u instanceof User); // trueinstanceof перевіряє,
чи є в ланцюжку прототипів об'єкта u посилання на User.prototype.
Приклад:
class Animal {}
class Dog extends Animal {}
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true: успадкування працює
console.log(dog instanceof Object); // true: усі об'єкти успадковують від Objectinstanceof йде по ланцюжку прототипів угору,
і якщо знаходить збіг із Class.prototype, повертає true.
2. Як instanceof працює під капотом
obj instanceof Classприблизно еквівалентно такому коду:
let proto = Object.getPrototypeOf(obj);
while (proto) {
if (proto === Class.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
return false;Тобто instanceof просто перевіряє наявність Class.prototype у ланцюжку __proto__.
3. Приклад, де успадкування впливає на результат
class A {}
class B extends A {}
class C extends B {}
const c = new C();
console.log(c instanceof A); // true
console.log(c instanceof B); // true
console.log(c instanceof C); // trueЛанцюжок прототипів:
c → C.prototype → B.prototype → A.prototype → Object.prototype → nullinstanceof послідовно йде вгору по ланцюжку.
4. Перевірка без instanceof: через constructor
Можна перевірити, чи збігається конструктор об'єкта з класом:
class User {}
const u = new User();
console.log(u.constructor === User); // trueАле:
- Цей спосіб ламається, якщо об'єкт створено через
Object.create(). - Або якщо хтось змінив
prototype.constructor.
const fake = Object.create(User.prototype);
console.log(fake.constructor === User); // true
console.log(fake instanceof User); // trueОбидва способи працюють, доки ланцюжок прототипів не зламано.
5. Альтернатива: через Object.getPrototypeOf
class User {}
const u = new User();
console.log(Object.getPrototypeOf(u) === User.prototype); // trueПрацює лише для прямого екземпляра.
Якщо є успадкування, цей метод не піднімається вище по ланцюжку (на відміну від instanceof).
6. Перевірка вбудованих класів (Array, Date, Error, Map та ін.)
console.log([] instanceof Array); // true
console.log([] instanceof Object); // true
console.log(new Date() instanceof Date); // true
console.log(new Date() instanceof Object); // trueinstanceof працює зі вбудованими класами точно так само,
адже вони теж побудовані на прототипах.
7. Важливо при роботі з різними "реальностями" (iframe, worker тощо)
Якщо об'єкт створено в іншому контексті (наприклад, іншому iframe),
його Array чи Object, це інший конструктор,
тому instanceof може повернути false.
// В іншому iframe:
console.log(arr instanceof window.Array); // falseРішення: використовувати
Array.isArray(arr); // безпечно навіть між контекстами8. Приклад зі статичним методом перевірки
Іноді до класу додають власний метод перевірки:
class User {
static isUser(obj) {
return obj instanceof User;
}
}
const u = new User();
console.log(User.isUser(u)); // trueТакий метод корисний у великих кодових базах, де типи часто перевіряються централізовано.
Підсумок
| Спосіб | Приклад | Перевіряє | Підтримує успадкування | Примітка |
|---|---|---|---|---|
instanceof | obj instanceof Class | Ланцюжок __proto__ | Так | Надійний |
constructor | obj.constructor === Class | Конструктор об'єкта | Частково | Ламається при зміненому prototype |
Object.getPrototypeOf | Object.getPrototypeOf(obj) === Class.prototype | Прямий прототип | Ні | Лише для прямого класу |
| Статичний метод | Class.isInstance(obj) | Будь-яка логіка | Так | Зручно у великих проєктах |
Коротко:
Перевірити, що об'єкт є екземпляром класу, можна так:
javascriptobj instanceof ClassЦей оператор:
- йде по ланцюжку прототипів (
__proto__);- підтримує успадкування;
- працює і зі вбудованими класами (
Array,Date,Error);- але може бути ненадійним між контекстами (iframe, Worker).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.