Skip to content

Commit 41d35b6

Browse files
committed
Ревью 2
1 parent cb4339d commit 41d35b6

1 file changed

Lines changed: 18 additions & 17 deletions

File tree

1-js/09-classes/07-mixins/article.md

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Иногда это может ограничивать нас. Например, у нас есть класс `StreetSweeper` и класс `Bicycle`, а мы хотим создать `StreetSweepingBicycle`.
66

7-
Или, говоря о программировании, у нас есть класс `Renderer`, который реализует шаблон, и класс `EventEmitter`, реализующий событие. Мы хотели бы объединить их функционал в классе `Page`, чтобы создать страницу, которая будет использовать шаблон и запускать событие.
7+
Или, говоря о программировании, у нас есть класс `User`, который реализует пользователей, и класс `EventEmitter`, реализующий события. Мы хотели бы добавить функционал класса `EventEmitter` к `User`, чтобы пользователи могли легко генерировать события.
88

99
Для таких случаев существуют "примеси".
1010

@@ -47,7 +47,7 @@ Object.assign(User.prototype, sayHiMixin);
4747
new User("Dude").sayHi(); // Hello Dude!
4848
```
4949

50-
Это не наследование, а просто копирование методов. Таким образом, класс `User` может расширять другие классы, но при этом также включать в себя примеси, "подмешивающие" другие методы.
50+
Это не наследование, а просто копирование методов. Таким образом, класс `User` может наследовать от другого класса, но при этом также включать в себя примеси, "подмешивающие" другие методы.
5151

5252
Например:
5353

@@ -61,7 +61,7 @@ Object.assign(User.prototype, sayHiMixin);
6161

6262
Примеси могут наследовать друг другу.
6363

64-
В примере ниже `sayHiMixin` наследуется от `sayMixin`:
64+
В примере ниже `sayHiMixin` наследует от `sayMixin`:
6565

6666
```js run
6767
let sayMixin = {
@@ -101,6 +101,7 @@ new User("Dude").sayHi(); // Hello Dude!
101101

102102
![](mixin-inheritance.png)
103103

104+
Так как super ищет родительские методы в `[[HomeObject]].[[Prototype]]`, это означает `sayHiMixin.[[Prototype]]`, а не `User.[[Prototype]]`.
104105
Это связано с тем, что методы `sayHi` и `sayBye` были изначально созданы в объекте `sayHiMixin`. Так что их внутреннее свойство `[[HomeObject]]` ссылается на `sayHiMixin`, как показано на картинке выше.
105106

106107
Вызов `super` ищет родительские методы в `[[HomeObject]].__proto__`, что означает `sayHiMixin.__proto__`, а не `User.__proto__`.
@@ -109,17 +110,17 @@ new User("Dude").sayHi(); // Hello Dude!
109110

110111
А сейчас давайте создадим примесь, полезную в реальной жизни.
111112

112-
Многие объекты в браузерной разработке (и не только) обладают важной способностью - они могут работать с событиями. События - это способ передачи информации всем, кто в ней заинтересован. Давайте создадим примесь, которая позволит легко добавлять функционал по работе с событиями любым классам/объектам.
113+
Многие объекты в браузерной разработке (и не только) обладают важной способностью - они могут генерировать события. События - отличный способ передачи информации всем, кто в ней заинтересован. Давайте создадим примесь, которая позволит легко добавлять функционал по работе с событиями любым классам/объектам.
113114

114-
- Примесь добавит метод `.trigger(name, [data])` для генерации события. Аргумент `name` - это имя события, за которым следует опциональный аргумент `data`.
115-
- Также будет добавлен метод `.on(name, handler)`, который назначает обработчик для события с заданным именем. Обработчик будет вызван, когда событие произойдёт.
115+
- Примесь добавит метод `.trigger(name, [data])` для генерации события. Аргумент `name` - это имя события, за которым могут следовать другие аргументы с данными для события.
116+
- Также будет добавлен метод `.on(name, handler)`, который назначает обработчик для события с заданным именем. Обработчик будет вызван, когда произойдёт событие с указанным именем `name`, и получит данные из `.trigger`.
116117
- ...и метод `.off(name, handler)`, который удаляет обработчик указанного события.
117118

118-
После того, как все методы примеси будут добавлены, объект `user` сможет сгенерировать событие `"login"` после входа пользователя в личный кабинет. Объект `calendar` тоже может рассчитывать на событие `"login"`, чтобы показывать зашедшему пользователю актуальный для него календарь.
119+
После того, как все методы примеси будут добавлены, объект `user` сможет сгенерировать событие `"login"` после входа пользователя в личный кабинет. А другой объект, к примеру, `calendar` сможет использовать это событие, чтобы показывать зашедшему пользователю актуальный для него календарь.
119120

120-
Или `menu` может генерировать событие `"select"`, когда элемент меню выбран, а другие объекты могут захотеть получить эту информацию и тоже отреагировать на это событие.
121+
Или `menu` может генерировать событие `"select"`, когда элемент меню выбран, а другие объекты могут назначать обработчики, чтобы реагировать на это событие, и т.п.
121122

122-
Рассмотрим это всё на примере:
123+
Вот код примеси:
123124

124125
```js run
125126
let eventMixin = {
@@ -170,7 +171,7 @@ let eventMixin = {
170171

171172
2. `.off(eventName, handler)` -- убирает функцию из списка обработчиков.
172173

173-
3. `.trigger(eventName, ...args)` -- генерирует событие: все назначенные обработчики из `_eventHandlers[eventName]` вызываются, и `args` передаётся им в качестве аргумента.
174+
3. `.trigger(eventName, ...args)` -- генерирует событие: все назначенные обработчики из `_eventHandlers[eventName]` вызываются, и `...args` передаются им в качестве аргументов.
174175

175176
Использование:
176177

@@ -181,23 +182,23 @@ class Menu {
181182
this.trigger("select", value);
182183
}
183184
}
184-
// Добавим примесь
185+
// Добавим примесь с методами для событий
185186
Object.assign(Menu.prototype, eventMixin);
186187

187188
let menu = new Menu();
188189

189-
// Вызовем обработчик на событие "select":
190+
// Добавить обработчик, который будет вызван при событии "select":
190191
*!*
191192
menu.on("select", value => alert(`Выбранное значение: ${value}`));
192193
*/!*
193194

194-
// Запустили событие => будет показано "Выбранное значение: 123"
195-
menu.choose("123"); // выбранное значение
195+
// Генерирует событие => обработчик выше запускается и выводит:
196+
menu.choose("123"); // Выбранное значение: 123
196197
```
197198

198-
Если у нас есть код, заинтересованный в событии "select", то он может подписаться на него с помощью `menu.on(...)`.
199+
Теперь если у нас есть код, заинтересованный в событии `"select"`, то он может слушать его с помощью `menu.on(...)`.
199200

200-
И `eventMixin` позволяет легко добавить такое поведение в любой класс без вмешательства в цепочку наследования.
201+
А `eventMixin` позволяет легко добавить такое поведение в любой класс без вмешательства в цепочку наследования.
201202

202203
## Итого
203204

@@ -207,4 +208,4 @@ menu.choose("123"); // выбранное значение
207208

208209
Мы можем использовать примеси для расширения функционала классов, например, для обработки событий, как мы сделали это выше.
209210

210-
С примесями могут возникнуть проблемы, если они перезаписывают нативные методы класса. Стоит помнить об этом и быть внимательнее при выборе имён методов для примеси, чтобы избежать конфликтов и ошибок.
211+
С примесями могут возникнуть проблемы, если они перезаписывают существующие методы класса. Стоит помнить об этом и быть внимательнее при выборе имён для методов примеси, чтобы избежать конфликтов.

0 commit comments

Comments
 (0)