You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/09-classes/02-class-inheritance/article.md
+13-8Lines changed: 13 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -93,23 +93,25 @@ new User().sayHi(); // Привет
93
93
94
94
## Переопределение методов
95
95
96
-
Давайте пойдём дальше и переопределим метод. Сейчас `Rabbit` наследует от `Animal` метод `stop`, который устанавливает `this.speed = 0`.
96
+
Теперь давайте продвинемся дальше и переопределим метод. По умолчанию все методы, которые не указаны в `class Rabbit`, берутся непосредственно "как есть" из `class Animal`.
97
97
98
-
Если мы определим свой метод `stop` в классе `Rabbit`, то он будет использоваться взамен родительского:
98
+
Но если мы укажем наш собственный метод в `Rabbit`, например `stop()`, то вместо него будет использоваться он:
99
99
100
100
```js
101
101
class Rabbit extends Animal {
102
102
stop() {
103
-
// ...будет использован для rabbit.stop()
103
+
// ...теперь это будет использоваться для rabbit.stop()
104
+
// вместо stop() из класса Animal
104
105
}
105
106
}
106
107
```
107
108
108
-
...Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.
109
+
Впрочем, обычно мы не хотим полностью заменить родительский метод, а скорее хотим сделать новый на его основе, изменяя или расширяя его функциональность. Мы делаем что-то в нашем методе и вызываем родительский метод до/после или в процессе.
109
110
110
111
У классов есть ключевое слово `"super"` для таких случаев.
112
+
111
113
- `super.method(...)` вызывает родительский метод.
112
-
- `super(...)` вызывает родительский конструктор (работает только внутри нашего конструктора).
114
+
- `super(...)` для вызова родительского конструктора (работает только внутри нашего конструктора).
113
115
114
116
Пусть наш кролик автоматически прячется при остановке:
115
117
@@ -128,7 +130,7 @@ class Animal {
128
130
129
131
stop() {
130
132
this.speed = 0;
131
-
alert(`${this.name} стоит.`);
133
+
alert(`${this.name} стоит неподвижно.`);
132
134
}
133
135
134
136
}
@@ -158,6 +160,7 @@ rabbit.stop(); // Белый кролик стоит. Белый кролик п
158
160
Как упоминалось в главе <info:arrow-functions>, стрелочные функции не имеют `super`.
159
161
160
162
При обращении к `super` стрелочной функции он берётся из внешней функции:
163
+
161
164
```js
162
165
class Rabbit extends Animal {
163
166
stop() {
@@ -227,11 +230,13 @@ let rabbit = new Rabbit("Белый кролик", 10); // Error: this is not de
227
230
228
231
Упс! При создании кролика - ошибка! Что не так?
229
232
230
-
Если коротко, то в классах-потомках конструктор обязан вызывать `super(...)`, и (!) делать это перед использованием `this`.
233
+
Если коротко, то:
234
+
235
+
- В классах-потомках конструктор обязан вызывать `super(...)`, и (!) делать это перед использованием `this`.
231
236
232
237
...Но почему? Что происходит? Это требование кажется довольно странным.
233
238
234
-
Конечно, всему есть объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
239
+
Конечно, всему есть свое объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
235
240
236
241
В JavaScript существует различие между "функцией-конструктором наследующего класса" и всеми остальными. В наследующем классе соответствующая функция-конструктор помечена специальным внутренним свойством `[[ConstructorKind]]:"derived"`.
0 commit comments