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

Через какое ключевое слово наследуются классы

1.6 Junior🔥 201 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Наследование классов в JavaScript

Наследование классов в JavaScript реализуется через ключевое слово extends.

Синтаксис extends

class Parent {
  constructor(name) {
    this.name = name;
  }

  greet() {
    return `Привет, ${this.name}!`;
  }
}

// Дочерний класс наследует от родительского
class Child extends Parent {
  constructor(name, age) {
    super(name); // вызов конструктора родителя
    this.age = age;
  }

  greet() {
    return `${super.greet()} Мне ${this.age} лет.`;
  }
}

const child = new Child('Иван', 10);
console.log(child.greet()); // Привет, Иван! Мне 10 лет.

Ключевое слово super()

super() вызывает конструктор родительского класса и обязателен при переопределении конструктора:

class Animal {
  constructor(name) {
    this.name = name;
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // передаем аргументы в родительский конструктор
    this.breed = breed;
  }
}

const dog = new Dog('Рекс', 'Лабрадор');
console.log(dog.name); // Рекс
console.log(dog.breed); // Лабрадор

Переопределение методов

class Vehicle {
  start() {
    return 'Транспорт запущен';
  }
}

class Car extends Vehicle {
  start() {
    return 'Машина запущена';
  }
}

const car = new Car();
console.log(car.start()); // Машина запущена

Вызов методов родителя через super

class Person {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    return ${this.name}`;
  }
}

class Student extends Person {
  constructor(name, grade) {
    super(name);
    this.grade = grade;
  }

  introduce() {
    // вызываем метод родителя через super
    return `${super.introduce()}, я студент ${this.grade} класса`;
  }
}

const student = new Student('Анна', 10);
console.log(student.introduce()); 
// Я Анна, я студент 10 класса

Множественное наследование (не поддерживается)

JavaScript не поддерживает множественное наследование напрямую:

// ❌ Это НЕ работает
class Child extends Parent1, Parent2 {}

// ✅ Вместо этого используй composition (композицию)
class Child {
  constructor() {
    this.parent1 = new Parent1();
    this.parent2 = new Parent2();
  }
}

Статические методы и наследование

class Parent {
  static info() {
    return 'Я родитель';
  }
}

class Child extends Parent {
  static info() {
    return `${super.info()} и у меня есть дети`;
  }
}

console.log(Child.info()); // Я родитель и у меня есть дети

Проверка наследования (instanceof)

class Animal {}
class Dog extends Animal {}

const dog = new Dog();

console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true

Цепочка прототипов

class A {
  methodA() { return 'A'; }
}

class B extends A {
  methodB() { return 'B'; }
}

class C extends B {
  methodC() { return 'C'; }
}

const c = new C();
console.log(c.methodA()); // A — из класса A
console.log(c.methodB()); // B — из класса B
console.log(c.methodC()); // C — из класса C

Важные правила

  1. super() должен быть вызван ДО использования this в конструкторе дочернего класса
  2. Дочерний класс может переопределять методы родителя
  3. Используй super.method() для вызова методов родителя
  4. JavaScript поддерживает однослойное наследование (extends только один класс)
  5. Для сложной логики вместо наследования лучше использовать composition (композицию)

Рекомендации

✅ Используй extends когда:

  • Есть четкая иерархия (Student extends Person)
  • Нужно переопределить методы родителя
  • Дочерний класс расширяет функциональность родителя

❌ Не используй extends когда:

  • Нужна сложная логика (используй композицию)
  • Нужно наследовать от множества классов
  • Логика может измениться (используй interfaces и типы)

Ключевое слово extends — это основной инструмент для построения иерархии классов в JavaScript.