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
+3-75Lines changed: 3 additions & 75 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -68,88 +68,16 @@ rabbit.hide(); // Белый кролик прячется!
68
68
69
69
Как мы помним из главы <info:native-prototypes>, в JavaScript используется наследование на прототипах для встроенных объектов. Например `Date.prototype.[[Prototype]]` это `Object.prototype`. Вот почему у dates есть доступ к общим объектным методам.
70
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
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.
92
-
````
93
-
94
-
95
-
96
-
97
-
Сейчас они полностью независимы.
98
-
99
-
Но мы хотим, чтобы `Rabbit` расширял `Animal`. Другими словами, кролики должны происходить от животных, т.е. иметь доступ к методам `Animal` и расширять функциональность `Animal` своими методами.
100
-
101
-
Для того, чтобы наследовать класс от другого, мы должны использовать ключевое слово `"extends"` и указать название родительского класса перед `{..}`.
102
-
103
-
Ниже `Rabbit` наследует от `Animal`:
104
-
105
-
```js run
106
-
class Animal {
107
-
constructor(name) {
108
-
this.speed = 0;
109
-
this.name = name;
110
-
}
111
-
run(speed) {
112
-
this.speed = speed;
113
-
alert(`${this.name} бежит со скоростью ${this.speed}.`);
114
-
}
115
-
stop() {
116
-
this.speed = 0;
117
-
alert(`${this.name} стоит.`);
118
-
}
119
-
}
120
-
121
-
// Наследуем от Animal указывая "extends Animal"
122
-
*!*
123
-
class Rabbit extends Animal {
124
-
*/!*
125
-
hide() {
126
-
alert(`${this.name} прячется!`);
127
-
}
128
-
}
129
-
130
-
let rabbit = new Rabbit("Белый кролик");
131
-
132
-
rabbit.run(5); // Белый кролик бежит со скоростью 5.
133
-
rabbit.hide(); // Белый кролик прячется!
134
-
```
135
-
Теперь код `Rabbit` стал короче, так как используется конструктор класса `Animal` по умолчанию и кролик может использовать метод `run` как и все животные.
136
-
137
-
Ключевое слово `extends` работает, используя прототипы. Оно устанавливает `Rabbit.prototype.[[Prototype]]` в `Animal.prototype`. Так что если метод не найден в `Rabbit.prototype`, JavaScript берёт его из `Animal.prototype`.
138
-
139
-

140
-
141
-
Как мы помним из главы <info:native-prototypes>, в JavaScript используется наследование на прототипах для встроенных объектов. Например `Date.prototype.[[Prototype]]` это `Object.prototype`, поэтому у дат есть универсальные методы объекта.
0 commit comments