---
sidebar_position: 2
---

# Наследование классов
Наследование классов – это способ расширения одного класса другим классом.
Таким образом, мы можем добавить новый функционал к уже существующему.

1. Чтобы унаследовать от класса: class Child extends Parent:
    -При этом Child.prototype.__proto__ будет равен Parent.prototype, так что методы будут унаследованы.
2. При переопределении конструктора:
   - Обязателен вызов конструктора родителя super() в конструкторе Child до обращения к this.
3. При переопределении другого метода:
   - Мы можем вызвать super.method() в методе Child для обращения к методу родителя Parent.
4. Внутренние детали:
   - Методы запоминают свой объект во внутреннем свойстве [[HomeObject]]. Благодаря этому работает super, он в его прототипе ищет родительские методы.
   - Поэтому копировать метод, использующий super, между разными объектами небезопасно.
         
- У стрелочных функций нет своего this и super, поэтому они «прозрачно» встраиваются во внешний контекст.

## Ключевое слово «extends»
Синтаксис создания класса допускает указывать после extends не только класс, но и любое выражение.
Пример вызова функции, которая генерирует родительский класс:
```js
function f(phrase) {
  return class {
    sayHi() { alert(phrase); }
  };
}
class User extends f("Привет") {}
new User().sayHi(); // Привет
```
Здесь class User наследует от результата вызова f("Привет").

## Переопределение методов
```js
class Rabbit extends Animal {
  stop() {
    // ...теперь это будет использоваться для rabbit.stop()
    // вместо stop() из класса Animal
  }
}
```

У классов есть ключевое слово "super", чтобы сделать новый на его основе, изменяя или расширяя его функциональность

super.method(...) вызывает родительский метод.
super(...) для вызова родительского конструктора (работает только внутри нашего конструктора).

🚀 **Источник: [https://learn.javascript.ru/class-inheritance](https://learn.javascript.ru/class-inheritance)**