Кратко
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 — как проверка родословной. Вы спрашиваете: «Этот объект — потомок этого класса?» Он идёт по цепочке прототипов и проверяет.
Примеры
**Самый простой:**
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); // trueinstanceof проверяет всю цепочку наследования.
**Простой:**
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 для проверки типа в функции.
**Реальный пример:**
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) — прототипное наследование подробнее.