Skip to content

Commit 35b99f0

Browse files
authored
👾 smth
1 parent 4ac4e6c commit 35b99f0

1 file changed

Lines changed: 13 additions & 8 deletions

File tree

1-js/09-classes/02-class-inheritance/article.md

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,25 @@ new User().sayHi(); // Привет
9393
9494
## Переопределение методов
9595
96-
Давайте пойдём дальше и переопределим метод. Сейчас `Rabbit` наследует от `Animal` метод `stop`, который устанавливает `this.speed = 0`.
96+
Теперь давайте продвинемся дальше и переопределим метод. По умолчанию все методы, которые не указаны в `class Rabbit`, берутся непосредственно "как есть" из `class Animal`.
9797
98-
Если мы определим свой метод `stop` в классе `Rabbit`, то он будет использоваться взамен родительского:
98+
Но если мы укажем наш собственный метод в `Rabbit`, например `stop()`, то вместо него будет использоваться он:
9999
100100
```js
101101
class Rabbit extends Animal {
102102
stop() {
103-
// ...будет использован для rabbit.stop()
103+
// ...теперь это будет использоваться для rabbit.stop()
104+
// вместо stop() из класса Animal
104105
}
105106
}
106107
```
107108
108-
...Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.
109+
Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.
109110
110111
У классов есть ключевое слово `"super"` для таких случаев.
112+
111113
- `super.method(...)` вызывает родительский метод.
112-
- `super(...)` вызывает родительский конструктор (работает только внутри нашего конструктора).
114+
- `super(...)` для вызова родительского конструктора (работает только внутри нашего конструктора).
113115
114116
Пусть наш кролик автоматически прячется при остановке:
115117
@@ -128,7 +130,7 @@ class Animal {
128130
129131
stop() {
130132
this.speed = 0;
131-
alert(`${this.name} стоит.`);
133+
alert(`${this.name} стоит неподвижно.`);
132134
}
133135
134136
}
@@ -158,6 +160,7 @@ rabbit.stop(); // Белый кролик стоит. Белый кролик п
158160
Как упоминалось в главе <info:arrow-functions>, стрелочные функции не имеют `super`.
159161
160162
При обращении к `super` стрелочной функции он берётся из внешней функции:
163+
161164
```js
162165
class Rabbit extends Animal {
163166
stop() {
@@ -227,11 +230,13 @@ let rabbit = new Rabbit("Белый кролик", 10); // Error: this is not de
227230

228231
Упс! При создании кролика - ошибка! Что не так?
229232

230-
Если коротко, то в классах-потомках конструктор обязан вызывать `super(...)`, и (!) делать это перед использованием `this`.
233+
Если коротко, то:
234+
235+
- В классах-потомках конструктор обязан вызывать `super(...)`, и (!) делать это перед использованием `this`.
231236

232237
...Но почему? Что происходит? Это требование кажется довольно странным.
233238

234-
Конечно, всему есть объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
239+
Конечно, всему есть свое объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
235240

236241
В JavaScript существует различие между "функцией-конструктором наследующего класса" и всеми остальными. В наследующем классе соответствующая функция-конструктор помечена специальным внутренним свойством `[[ConstructorKind]]:"derived"`.
237242

0 commit comments

Comments
 (0)