50 lines
3.0 KiB
Markdown
50 lines
3.0 KiB
Markdown
---
|
||
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)** |