update classes

This commit is contained in:
2025-03-05 15:12:57 +03:00
parent 31caa0e6de
commit 8b08f95ce0
12 changed files with 421 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
---
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(...) для вызова родительского конструктора (работает только внутри нашего конструктора).