update classes
This commit is contained in:
48
docs/javascript/06-classes/02-inheritance-classes.md
Normal file
48
docs/javascript/06-classes/02-inheritance-classes.md
Normal 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(...) для вызова родительского конструктора (работает только внутри нашего конструктора).
|
||||
Reference in New Issue
Block a user