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
+62-10Lines changed: 62 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,13 @@
1
+
1
2
# Наследование классов
2
3
3
-
Допустим, у нас есть два класса.
4
+
Наследование классов - это возможность для одного класса расширить другой класс.
5
+
6
+
Таким образом, мы можем создавать новые функциональные возможности поверх существующих.
7
+
8
+
## Ключевое слово "extends"
4
9
5
-
`Animal`:
10
+
Допустим, у нас есть класс `Animal`:
6
11
7
12
```js
8
13
classAnimal {
@@ -16,31 +21,78 @@ class Animal {
16
21
}
17
22
stop() {
18
23
this.speed=0;
19
-
alert(`${this.name} стоит.`);
24
+
alert(`${this.name} стоит неподвижно.`);
20
25
}
21
26
}
22
27
23
28
let animal =newAnimal("Мой питомец");
24
29
```
25
30
31
+
Вот как мы можем представить объект `animal` и класс `Animal` графически:
32
+
26
33

27
34
28
-
...И `Rabbit`:
35
+
...И мы хотели бы создать еще один `class Rabbit`.
36
+
37
+
Поскольку кролики - это животные, класс `Rabbit` должен быть основан на `Animal`, иметь доступ к методам animal, так чтобы кролики могли делать то, что могут делать "общие" животные.
38
+
39
+
Синтаксис для расширения другого класса таков: `class Child extends Parent`.
40
+
41
+
Давайте создадим класс `Rabbit`, который наследуется от `Animal`:
29
42
30
43
```js
31
-
classRabbit {
32
-
constructor(name) {
33
-
this.name= name;
34
-
}
44
+
*!*
45
+
classRabbitextendsAnimal {
46
+
*/!*
35
47
hide() {
36
48
alert(`${this.name} прячется!`);
37
49
}
38
50
}
39
51
40
-
let rabbit =newRabbit("Мой кролик");
52
+
let rabbit =newRabbit("Белый кролик");
53
+
54
+
rabbit.run(5); // Белый кролик бежит со скоростью 5.
55
+
rabbit.hide(); // Белый кролик прячется!
56
+
```
57
+
58
+
Объект класса `Rabbit` имеет доступ как к методам `Rabbit`, таким как `rabbit.hide()`, так и к методам `Animal`, таким как `rabbit.run()`.
59
+
60
+
Внутренне ключевое слово `extends` работает с использованием старой доброй механики прототипов. Он устанавливает `Rabbit.prototype.[[Prototype]]` на `Animal.prototype`. Таким образом, если метод не был найден в `Rabbit.prototype`, JavaScript берет его из `Animal.prototype`.
61
+
62
+

63
+
64
+
Например, чтобы найти метод `rabbit.run`, движок проверяет (снизу вверх на картинке):
65
+
1. Объект `rabbit` (не имеет `run`).
66
+
2. Его прототип, то есть `Rabbit.prototype` (имеет `hide`, но не `run`).
67
+
3. Его прототип, то есть (вследствие `extends`) `Animal.prototype`, в котором, наконец, есть метод `run`.
68
+
69
+
Как мы помним из главы <info:native-prototypes>, в JavaScript используется наследование на прототипах для встроенных объектов. Например `Date.prototype.[[Prototype]]` это `Object.prototype`. Вот почему у dates есть доступ к общим объектным методам.
70
+
71
+
````smart header="Any expression is allowed after `extends`"
72
+
Class syntax allows to specify not just a class, but any expression after `extends`.
73
+
74
+
For instance, a function call that generates the parent class:
75
+
76
+
```js run
77
+
functionf(phrase) {
78
+
returnclass {
79
+
sayHi() { alert(phrase); }
80
+
};
81
+
}
82
+
83
+
*!*
84
+
classUserextendsf("Hello") {}
85
+
*/!*
86
+
87
+
newUser().sayHi(); // Hello
41
88
```
89
+
Here `class User` inherits from the result of `f("Hello")`.
90
+
91
+
That may be useful for advanced programming patterns when we use functions to generate classes depending on many conditions and can inherit from them.
0 commit comments