← Назад к вопросам

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

1.8 Middle🔥 111 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

В JavaScript проверка отношений между классами (наследования) выполняется с помощью оператора instanceof и метода Object.getPrototypeOf(), а также через сравнение прототипов. В классах, появившихся в ES6, для этой задачи можно использовать свойство prototype и функцию Object.prototype.isPrototypeOf(). Рассмотрим основные подходы.

Использование оператора instanceof

Оператор instanceof проверяет, принадлежит ли объект к определенному классу или его наследникам. Однако он работает с объектами, а не с классами напрямую. Чтобы проверить наследование классов, нужно создать экземпляр.

class Animal {}
class Dog extends Animal {}

const dog = new Dog();
console.log(dog instanceof Animal); // true
console.log(dog instanceof Dog); // true

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

Проверка через прототипы (Object.getPrototypeOf() и prototype)

Ключевой механизм наследования в JavaScript основан на прототипах. У каждого класса есть свойство prototype, а у каждого объекта — внутренняя ссылка __proto__ (лучше использовать Object.getPrototypeOf()). Для проверки, является ли один класс подклассом другого, можно сравнить их прототипы.

class Animal {}
class Dog extends Animal {}
class Bulldog extends Dog {}

// Проверка: Dog является подклассом Animal?
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
// Проверка: Bulldog является подклассом Dog?
console.log(Dog.prototype.isPrototypeOf(Bulldog.prototype)); // true
// Проверка: Bulldog является подклассом Animal?
console.log(Animal.prototype.isPrototypeOf(Bulldog.prototype)); // true

Метод Object.prototype.isPrototypeOf() проверяет, находится ли прототип одного класса в цепочке прототипов другого класса. Это прямо указывает на наследование.

Сравнение с помощью Object.getPrototypeOf()

Альтернативный способ — получить прототип класса и сравнить его с прототипом родителя.

class Animal {}
class Dog extends Animal {}

// Получаем прототип класса Dog
const dogPrototype = Object.getPrototypeOf(Dog.prototype);
console.log(dogPrototype === Animal.prototype); // true

Это показывает, что Dog.prototype напрямую наследует от Animal.prototype.

Создание универсальной функции для проверки

Для удобства можно создать функцию, которая проверяет, является ли один класс подклассом другого.

function isSubclass(childClass, parentClass) {
  // Проверяем, что childClass является классом и наследует от parentClass
  return parentClass.prototype.isPrototypeOf(childClass.prototype);
}

class Animal {}
class Dog extends Animal {}
class Bulldog extends Dog {}

console.log(isSubclass(Dog, Animal)); // true
console.log(isSubclass(Bulldog, Dog)); // true
console.log(isSubclass(Bulldog, Animal)); // true
console.log(isSubclass(Animal, Dog)); // false

Эта функция использует прототипную цепочку и работает эффективно.

Особенности и ограничения

  • Проверка работает только для классов ES6 и функций-конструкторов, поскольку в JavaScript наследование реализовано через прототипы.
  • Если классы используют статическое наследование (например, через Object.setPrototypeOf() для статических методов), это не влияет на проверку подклассов через prototype.
  • В случае null-прототипов (объекты созданные через Object.create(null)), проверка может не работать, так как у них отсутствует цепочка прототипов.

Пример комплексной проверки

Рассмотрим ситуацию с многоуровневым наследованием и смешанными типами (классы и функции-конструкторы).

function OldSchoolAnimal() {}
class ModernAnimal {}
class Dog extends ModernAnimal {}

// Для функции-конструктора
console.log(OldSchoolAnimal.prototype.isPrototypeOf(Dog.prototype)); // false
// Для класса
console.log(ModernAnimal.prototype.isPrototypeOf(Dog.prototype)); // true

Заключение

Чтобы определить, является ли класс дочерним подклассом другого класса в JavaScript, наиболее надежный способ — использовать метод Object.prototype.isPrototypeOf() для сравнения прототипов классов. Этот подход учитывает прототипную цепочку, которая является основой наследования в языке. Оператор instanceof подходит для проверки объектов, но не классов напрямую. Для частых проверок рекомендуется создать вспомогательную функцию, как показано выше, чтобы обеспечить чистоту и читаемость кода.

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