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
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -32,7 +32,7 @@ let animal = new Animal("Мой питомец");
32
32
33
33

34
34
35
-
...И мы хотели бы создать еще один `class Rabbit`.
35
+
...И мы хотели бы создать ещё один `class Rabbit`.
36
36
37
37
Поскольку кролики - это животные, класс `Rabbit` должен быть основан на `Animal`, иметь доступ к методам animal, так чтобы кролики могли делать то, что могут делать "общие" животные.
38
38
@@ -236,7 +236,7 @@ let rabbit = new Rabbit("Белый кролик", 10); // Error: this is not de
236
236
237
237
...Но почему? Что происходит? Это требование кажется довольно странным.
238
238
239
-
Конечно, всему есть свое объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
239
+
Конечно, всему есть своё объяснение. Давайте углубимся в детали, чтобы вы действительно поняли, что происходит.
240
240
241
241
В JavaScript существует различие между "функцией-конструктором наследующего класса" и всеми остальными. В наследующем классе соответствующая функция-конструктор помечена специальным внутренним свойством `[[ConstructorKind]]:"derived"`.
В этом примечании предполагается, что у вас есть определенный опыт работы с классами, возможно, при работе с другими языками программирования.
286
+
В этом примечании предполагается, что у вас есть определённый опыт работы с классами, возможно, при работе с другими языками программирования.
287
287
288
-
Это дает лучшее представление о языке, а также объясняет поведение, которое может быть источником ошибок (но не очень часто).
288
+
Это даёт лучшее представление о языке, а также объясняет поведение, которое может быть источником ошибок (но не очень часто).
289
289
290
290
Если вы нашли этот материал слишком сложным, просто продолжайте, продолжайте читать, а затем вернитесь к нему через некоторое время.
291
291
```
292
292
293
293
Мы можем переопределять не только методы, но и поля класса.
294
294
295
-
Хотя, когда мы обращаемся к переопределенному полю в родительском конструкторе, возникает каверзное поведение, сильно отличающееся от большинства других языков программирования.
295
+
Хотя, когда мы обращаемся к переопределённому полю в родительском конструкторе, возникает каверзное поведение, сильно отличающееся от большинства других языков программирования.
296
296
297
297
Рассмотрим этот пример:
298
298
@@ -321,11 +321,11 @@ new Rabbit(); // animal
321
321
322
322
Что интересно, так это то, что в обоих случаях: `new Animal()` и `new Rabbit()`, `alert` в строке `(*)` показывает `animal`.
323
323
324
-
**Другими словами, родительский конструктор всегда использует свое собственное значение поля, а не переопределенное.**
324
+
**Другими словами, родительский конструктор всегда использует своё собственное значение поля, а не переопределенное.**
325
325
326
326
Что в этом странного?
327
327
328
-
Если это еще не ясно, пожалуйста, сравните с методами.
328
+
Если это ещё не ясно, пожалуйста, сравните с методами.
329
329
330
330
Вот тот же код, но вместо поля `this.name`, мы вызываем метод `this.showName()`:
331
331
@@ -354,7 +354,7 @@ new Rabbit(); // rabbit
354
354
355
355
Обратите внимание: теперь результат другой.
356
356
357
-
И это то, чего мы, естественно, ожидаем. Когда родительский конструктор вызывается в производном классе, он использует переопределенный метод.
357
+
И это то, чего мы, естественно, ожидаем. Когда родительский конструктор вызывается в производном классе, он использует переопределённый метод.
358
358
359
359
...Но для полей класса это не так. Как уже было сказано, родительский конструктор всегда использует родительское поле.
360
360
@@ -366,13 +366,13 @@ new Rabbit(); // rabbit
366
366
367
367
В нашем случае `Rabbit` - это производный класс. В нем нет конструктора `constructor()`. Как было сказано ранее, это то же самое, как если бы существовал пустой конструктор только с `super(...args)`.
368
368
369
-
Итак, `new Rabbit()` вызывает `super()`, таким образом, выполняя родительский конструктор, и (согласно правилу для производных классов) только после этого инициализируются поля его класса. На момент выполнения родительского конструктора еще нет полей класса `Rabbit`, поэтому используются поля `Animal`.
369
+
Итак, `new Rabbit()` вызывает `super()`, таким образом, выполняя родительский конструктор, и (согласно правилу для производных классов) только после этого инициализируются поля его класса. На момент выполнения родительского конструктора ещё нет полей класса `Rabbit`, поэтому используются поля `Animal`.
370
370
371
371
Это тонкое различие между полями и методами специфично для JavaScript.
372
372
373
-
К счастью, такое поведение проявляется только в том случае, если в родительском конструкторе используется переопределенное поле. Тогда может быть трудно понять, что происходит, поэтому мы объясняем это здесь.
373
+
К счастью, такое поведение проявляется только в том случае, если в родительском конструкторе используется переопределённое поле. Тогда может быть трудно понять, что происходит, поэтому мы объясняем это здесь.
374
374
375
-
Если это становится проблемой, ее можно исправить, используя методы или геттеры/сеттеры вместо полей.
375
+
Если это становится проблемой, её можно исправить, используя методы или геттеры/сеттеры вместо полей.
0 commit comments