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/07-mixins/article.md
+36-38Lines changed: 36 additions & 38 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,21 +2,21 @@
2
2
3
3
В JavaScript мы можем использовать наследование только от одного объекта. Объект имеет единственный `[[Prototype]]`. И класс может расширить только один другой класс.
4
4
5
-
Иногда это может ограничивать нас. Например, у нас есть класс `StreetSweeper` и класс `Bicycle`, и хотим создать `StreetSweepingBicycle`.
5
+
Иногда это может ограничивать нас. Например, у нас есть класс `StreetSweeper` и класс `Bicycle`, а мы хотим создать `StreetSweepingBicycle`.
6
6
7
-
Или, поговорим о программировании, у нас есть класс `Renderer`, который реализует шаблон и класс `EventEmitter` реализующий событие. И мы хотим объединить их функционалы вместе в классе `Page`. Создадим страницу, которая будет использовать шаблон, и использовать событие.
7
+
Или, говоря о программировании, у нас есть класс `Renderer`, который реализует шаблон, и класс `EventEmitter`, реализующий событие. Мы хотели бы объединить их функционал в классе `Page`, чтобы создать страницу, которая будет использовать шаблон и запускать событие.
8
8
9
-
Для таких случаев существует "примеси".
9
+
Для таких случаев существуют "примеси".
10
10
11
-
Как говориться в Википедии [примесь](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%81%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) является классом, который имеет методы и мы можем их использовать в других классов, без необходимости быть родителем этих классов.
11
+
Как говорится в Википедии,[примесь](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%81%D1%8C_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)) является классом, который имеет методы, и мы можем использовать эти методы в других классах, не будучи родителем тех классов.
12
12
13
-
Другими словами *примесь* определяет методы, которые реализуют определенное поведение. Мы не используем его в одиночку, а используем его, чтобы добавить другим классам больше функционала.
13
+
Другими словами,*примесь* определяет методы, которые реализуют определённое поведение. Мы не используем примесь саму по себе, она нужна, чтобы добавить другим классам больше функционала.
14
14
15
15
## Пример примеси
16
16
17
-
Простой путь создать примесь в JavaScript - это создать объект с использующимися методами, так что мы легко можем объединить их в прототип любого класса.
17
+
Простой путь создания примеси в JavaScript - это создание объекта с полезными методами, так чтобы мы легко могли добавить их в прототип любого класса.
18
18
19
-
В примере ниже примесь `sayHiMixin` имеет методы для речи класса `User`:
19
+
В примере ниже примесь `sayHiMixin` имеет методы для придания объектам класса `User` возможности вести разговор:
20
20
21
21
```js run
22
22
*!*
@@ -43,11 +43,11 @@ class User {
43
43
// копируем методы
44
44
Object.assign(User.prototype, sayHiMixin);
45
45
46
-
// сейчас User можем сказать hi
46
+
// сейчас User может сказать Hello
47
47
newUser("Dude").sayHi(); // Hello Dude!
48
48
```
49
49
50
-
Это не наследование, а простой способ скопировать методы. Таким образом, класс `User` может расширять другие классы и так же содержать в себе методы от примеси, например:
50
+
Это не наследование, а просто скопированные методы. Таким образом, класс `User` может расширять другие классы и также содержать в себе методы от примеси, например:
51
51
52
52
```js
53
53
classUserextendsPerson {
@@ -91,36 +91,36 @@ class User {
91
91
// копируем методы
92
92
Object.assign(User.prototype, sayHiMixin);
93
93
94
-
// сейчас User может сказать hi
94
+
// сейчас User может сказать Hello
95
95
newUser("Dude").sayHi(); // Hello Dude!
96
96
```
97
97
98
98
Обратите внимание, что мы вызвали родительский метод `super.say()` из `sayHiMixin` в прототипе другой примеси, а не в классе.
99
99
100
100

101
101
102
-
Это связано с тем, что методы из `sayHiMixin` имеют установку`[[HomeObject]]`. А `super` на самом деле означает `sayHiMixin.__ proto__`, а не `User.__ proto__`.
102
+
Это связано с тем, что методы из `sayHiMixin` имеют установленное свойство`[[HomeObject]]`. А `super` на самом деле означает `sayHiMixin.__ proto__`, а не `User.__ proto__`.
103
103
104
-
## Примесь события
104
+
## EventMixin
105
105
106
106
Сейчас давайте создадим примесь для реального случая.
107
107
108
-
Важная особенность при работе с объектами это работа с событиями.
108
+
Важная особенность при работе с объектами - это работа с событиями.
109
109
110
-
То есть объект должен иметь метод для «генерации события», когда с ним происходит что-то важное, а другие объекты должны иметь возможность «считывать» такие события.
110
+
То есть, объект должен иметь метод для "генерации события", когда с ним происходит что-то важное, а другие объекты должны иметь возможность "слушать" такие события.
111
111
112
-
Событие может иметь имя, необязательно, и связь между некоторыми дополнительными данными.
112
+
Событие должно иметь имя и, опционально, какие-то дополнительные данные, ассоциированные с ним.
113
113
114
-
Например, объект `user` может генерировать события`"login"`, когда посетитель входит. А другой объект `calendar` может захотеть получать его события, чтобы загрузить календарь для вошедшего человека.
114
+
Например, объект `user` может генерировать событие`"login"`, когда посетитель входит. А другой объект `calendar` может захотеть получать событие `"login"`, чтобы загрузить календарь для вошедшего пользователя.
115
115
116
-
Или `menu` может генерировать событие `"select"`, когда меню элемент выбран, или другие объекты могут захотеть получить эту информацию и отреагировать на это событие.
116
+
Или `menu` может генерировать событие `"select"`, когда элемент меню выбран, а другие объекты могут захотеть получить эту информацию и тоже отреагировать на это событие.
117
117
118
-
События — это способ «поделиться информацией» со всеми, кто этого захочет. Они могут быть полезны в любом классе, поэтому давайте сделаем для них пример:
118
+
События — это способ "поделиться информацией" со всеми, кто этого захочет. Они могут быть полезны в любом классе, поэтому давайте сделаем для них пример:
119
119
120
120
```js run
121
121
let eventMixin = {
122
122
/**
123
-
* Опишем события, используя:
123
+
* Подпишемся на событие, используя:
124
124
* menu.on('select', function(item) { ... }
125
125
*/
126
126
on(eventName, handler) {
@@ -132,7 +132,7 @@ let eventMixin = {
132
132
},
133
133
134
134
/**
135
-
* Закроем событие, используя:
135
+
* Отменим подписку, используя:
136
136
* menu.off('select', handler)
137
137
*/
138
138
off(eventName, handler) {
@@ -146,27 +146,27 @@ let eventMixin = {
146
146
},
147
147
148
148
/**
149
-
* Создадим событие и прикрепим данные
149
+
* Запустим событие и добавим к нему данные
150
150
* this.trigger('select', data1, data2);
151
151
*/
152
152
trigger(eventName, ...args) {
153
153
if (!this._eventHandlers||!this._eventHandlers[eventName]) {
// Запустили событие => будет показано "Выбранное значение: 123"
191
+
menu.choose("123"); //выбранное значение
192
192
```
193
193
194
-
Сейчас у нас есть код, который реагирует на выбор пользователя и мы можем связать его с `menu.on(...)`.
194
+
Если у нас есть код, заинтересованный в событии "select", то мы можем привязать его с помощью`menu.on(...)`.
195
195
196
-
И `eventMixin` может добавить поведение в любой класс какой мы хотим, без вмешательства в цепочку наследования.
196
+
И `eventMixin` может добавить такое поведение в любой класс без вмешательства в цепочку наследования.
197
197
198
198
## Итого
199
199
200
200
*Примесь* -- общий термин в объектно-ориентированном программировании: класс, который содержит в себе методы для других классов.
201
201
202
-
В других языках, как Python разрешается создавать примеси используя множественное наследование. JavaScript не поддерживает множественное наследование, но с помощью примесей мы можем реализовать это скопировав методы в прототип.
202
+
В других языках (например, Python) разрешается создавать примеси, используя множественное наследование. JavaScript не поддерживает множественное наследование, но с помощью примесей мы можем реализовать нечто похожее, скопировав методы в прототип.
203
203
204
-
Мы можем использовать примесь для дополнения множественного поведения классов, например, для обработки события, как мы делали это выше.
204
+
Мы можем использовать примеси для расширения функционала классов, например, для обработки событий, как мы сделали это выше.
205
205
206
-
Мы так же можем использовать примесь, как способ дополнить любой класс множественным поведением, например, обработкой событий, как мы сделали выше.
207
-
208
-
С примесями могут быть проблемы, если они будут перезаписывать нативные метода. Стоит помнить это и быть внимательней при назначении имени для примеси, чтобы избежать такую возможность ошибки.
206
+
С примесями могут возникнуть проблемы, если они перезаписывают нативные методы класса. Стоит помнить об этом и быть внимательнее при выборе имён методов для примеси, чтобы избежать конфликтов и ошибок.
0 commit comments