Gernar
Архитектура и принципы кода

Как узнать является ли класс дочерним подклассом

Разбор вопроса «Как узнать является ли класс дочерним подклассом» для 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 &#123; static [Symbol.hasInstance](obj) &#123; return /* кастомная логика */ &#125; &#125; позволит переопределить проверку для instanceof.

Содержание