JS Intermediate

instanceof

Научиться проверять, принадлежит ли объект классу, и понять как instanceof работает через prototype chain.

Средний (Intermediate)
Нужно знать:Классы

Кратко

instanceof проверяет, находится ли prototype объекта в цепочке прототипов класса. obj instanceof Class — true, если prototype класса есть в цепочке объекта.


Подробно

Коротко о прототипах, чтобы было понятно дальше: у каждого объекта есть скрытая ссылка [[Prototype]] на другой объект — его прототип. Если свойство не нашлось на самом объекте, JavaScript ищет его в прототипе, затем в прототипе прототипа и так далее — это и есть цепочка прототипов. У классов, созданных через class, эта цепочка автоматически выстраивается через extends. Детально механизм разберём в следующем уроке (JI13), здесь важно лишь то, что instanceof проверяет именно эту цепочку.

Синтаксис: obj instanceof Class

Возвращает true, если prototype класса (Class.prototype) находится в цепочке прототипов объекта.

Пример: class Animal {} class Dog extends Animal {}

const rex = new Dog(); console.log(rex instanceof Dog); // true console.log(rex instanceof Animal); // true (наследование!) console.log(rex instanceof Object); // true (всё — объект)

Как это работает: instanceof проверяет цепочку прототипов: rex → Dog.prototype → Animal.prototype → Object.prototype

Если Class.prototype найден в этой цепочке — true.

Ограничения:

  • Не работает с примитивами: 'hello' instanceof String → false
  • Не работает в разных iframe/window
  • === !== instanceof: [] instanceof Array — true, typeof [] — 'object'

Ментальная модель

instanceof — как проверка родословной. Вы спрашиваете: «Этот объект — потомок этого класса?» Он идёт по цепочке прототипов и проверяет.


Примеры

**Самый простой:**

javascript
class Cat {}
class Kitten extends Cat {}

const cat = new Cat();
const kitten = new Kitten();

console.log(cat instanceof Cat);      // true
console.log(kitten instanceof Cat);   // true
console.log(kitten instanceof Kitten); // true

instanceof проверяет всю цепочку наследования.

**Простой:**

javascript
function processValue(value) {
  if (value instanceof Array) {
    console.log(`Массив: ${value.length} элементов`);
  } else if (value instanceof Date) {
    console.log(`Дата: ${value.toLocaleDateString()}`);
  } else if (typeof value === 'string') {
    console.log(`Строка: ${value}`);
  }
}

processValue([1, 2, 3]); // 'Массив: 3 элементов'
processValue(new Date()); // 'Дата: ...'

instanceof для проверки типа в функции.

**Реальный пример:**

javascript
class ValidationError extends Error {
  constructor(field, message) {
    super(message);
    this.field = field;
    this.name = 'ValidationError';
  }
}

try {
  throw new ValidationError('email', 'Невалидный email');
} catch (error) {
  if (error instanceof ValidationError) {
    console.log(`Ошибка в поле ${error.field}: ${error.message}`);
  } else {
    console.log('Неизвестная ошибка');
  }
}

instanceof для определения типа ошибки.


Частые ошибки

**Неправильно:** Использовать instanceof для примитивов

**Почему:** 'hello' instanceof String — false! instanceof работает только с объектами.

**Правильно:** Для примитивов используйте typeof.

**Неправильно:** Путать typeof и instanceof

**Почему:** typeof [] === 'object', [] instanceof Array === true. Разные инструменты.

**Правильно:** typeof — для примитивов. instanceof — для проверки класса объектов.

**Неправильно:** Думать, что instanceof = проверка.constructor

**Почему:** instanceof проверяет prototype chain, не constructor напрямую.

**Правильно:** instanceof — цепочка прототипов. constructor — ссылка на функцию.


Важно запомнить

  • instanceof проверяет prototype chain
  • Работает только с объектами (не примитивами)
  • Наследование учитывается: Kitten instanceof Animal = true
  • typeof — для примитивов, instanceof — для классов объектов
  • Не работает между iframe/window

Связь

Назад: Вы знаете классы и прототипы (JI8-JI11) — теперь вы умеете проверять типы объектов.

Вперёд: Следующий урок (JI13) — прототипное наследование подробнее.

Материалы курса JS Intermediate — PROlab Academy.