Как узнать является ли класс дочерним подклассом
Разбор вопроса «Как узнать является ли класс дочерним подклассом» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Вопрос
Как узнать является ли класс дочерним подклассом
Профессия
Frontend Developer
Что хочет услышать интервьюер
Интервьюер хочет убедиться, что кандидат понимает механизмы наследования в JavaScript/TypeScript, знает разницу между проверкой экземпляра и проверкой наследования класса, и может предложить решения для разных контекстов (runtime vs compile-time).
Ключевые тезисы
- В JavaScript можно использовать
instanceofдля проверки принадлежности объекта к классу или его прототипной цепочке. - Для точной проверки наследования можно сравнить прототипы через
Object.getPrototypeOf(childClass) === parentClass.prototype. - В TypeScript можно использовать type guards или декораторы для проверки наследования на этапе компиляции.
Подробный ответ
В JavaScript проверка наследования классов может выполняться несколькими способами. Самый распространенный — оператор instanceof, который проверяет, присутствует ли конструктор родительского класса в цепочке прототипов объекта. Однако instanceof имеет ограничения, особенно при работе с разными контекстами выполнения (например, iframe), где идентичные конструкторы считаются разными. Для точной проверки наследования можно использовать сравнение прототипов через Object.getPrototypeOf(childClass) === parentClass.prototype. Этот метод более надежен, так как напрямую проверяет связь между прототипами. В TypeScript проверка наследования может быть выполнена на этапе компиляции с помощью type guards или декораторов, что добавляет дополнительную безопасность типов.
Практические примеры
Пример 1
Пример с instanceof:
class Parent {}
class Child extends Parent {}
const child = new Child();
console.log(child instanceof Parent); // trueПример 2
Пример с Object.getPrototypeOf():
class Parent {}
class Child extends Parent {}
console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); // trueПример 3
Пример в TypeScript с type guard:
function isChildOf<T>(obj: unknown, parent: new (...args: any[]) => T): obj is T {
return obj instanceof parent;
}
class Parent {}
class Child extends Parent {}
const child = new Child();
console.log(isChildOf(child, Parent)); // trueЧастые ошибки
- Использование
instanceofдля проверки наследования в разных контекстах выполнения (например, iframe), где он может давать ложные результаты. - Путаница между проверкой наследования класса и проверкой принадлежности объекта к классу (например, использование
instanceofвместо сравнения прототипов).
Связанные темы
- Прототипное наследование в JavaScript
- Работа с контекстами выполнения (iframe, Web Workers)
- TypeScript: type guards и декораторы
Follow-up вопросы
В чем разница между instanceof и Object.getPrototypeOf() при проверке наследования?
Уровень: intermediate
instanceof проверяет всю цепочку прототипов, включая родительские классы, а Object.getPrototypeOf() возвращает непосредственный прототип объекта. instanceof менее точен для проверки прямого наследования.
Как можно реализовать проверку наследования без использования instanceof?
Уровень: intermediate
Можно рекурсивно проверять прототипы через Object.getPrototypeOf() до совпадения с родительским прототипом или до null. Это даст точный результат, но требует больше кода.
Какие ограничения есть у instanceof при работе с iframe или разными контекстами выполнения?
Уровень: advanced
instanceof не работает корректно между разными iframe или контекстами, так как каждый имеет свою копию глобальных конструкторов. Для проверки нужно сравнивать строковые имена или использовать Symbol.hasInstance.
Как TypeScript помогает в проверке наследования на этапе компиляции?
Уровень: intermediate
TypeScript позволяет использовать type guards и условные типы для проверки совместимости типов. Например, child is Parent или extends в условных типах дают информацию о наследовании до выполнения кода.
Можно ли изменить поведение instanceof для кастомной логики проверки?
Уровень: advanced
Да, через статический метод Symbol.hasInstance в классе. Например, class Parent { static [Symbol.hasInstance](obj) { return /* кастомная логика */ } } позволит переопределить проверку для instanceof.
Как структуризировать классы в зависимости от конекста
Разбор вопроса «Как структуризировать классы в зависимости от конекста» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Какие знаешь особенности при разработке под Retina дисплей
Разбор вопроса «Какие знаешь особенности при разработке под Retina дисплей» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.