Skip to content

Commit 4ac4e6c

Browse files
authored
👾 smth
1 parent 635589f commit 4ac4e6c

1 file changed

Lines changed: 3 additions & 75 deletions

File tree

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

Lines changed: 3 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -68,88 +68,16 @@ rabbit.hide(); // Белый кролик прячется!
6868

6969
Как мы помним из главы <info:native-prototypes>, в JavaScript используется наследование на прототипах для встроенных объектов. Например `Date.prototype.[[Prototype]]` это `Object.prototype`. Вот почему у dates есть доступ к общим объектным методам.
7070

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-
function f(phrase) {
78-
return class {
79-
sayHi() { alert(phrase); }
80-
};
81-
}
82-
83-
*!*
84-
class User extends f("Hello") {}
85-
*/!*
86-
87-
new User().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-
![](animal-rabbit-extends.svg)
140-
141-
Как мы помним из главы <info:native-prototypes>, в JavaScript используется наследование на прототипах для встроенных объектов. Например `Date.prototype.[[Prototype]]` это `Object.prototype`, поэтому у дат есть универсальные методы объекта.
142-
14371
````smart header="После `extends` разрешены любые выражения"
144-
Синтаксис создания класса допускает указывать после `extends` не только класс, но любое выражение.
72+
Синтаксис создания класса допускает указывать после `extends` не только класс, но любое выражение после `extends`.
14573

14674
Пример вызова функции, которая генерирует родительский класс:
14775

14876
```js run
14977
function f(phrase) {
15078
return class {
151-
sayHi() { alert(phrase) }
152-
}
79+
sayHi() { alert(phrase); }
80+
};
15381
}
15482

15583
*!*

0 commit comments

Comments
 (0)