Files
frontend-docs/docs/javascript/06-classes/02-inheritance-classes.md
2025-03-05 15:12:57 +03:00

48 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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(...) для вызова родительского конструктора (работает только внутри нашего конструктора).