Skip to content

Commit 8093d86

Browse files
committed
Доработки curveball
1 parent a95d4f6 commit 8093d86

2 files changed

Lines changed: 41 additions & 43 deletions

File tree

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

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22

33
В JavaScript мы можем использовать наследование только от одного объекта. Объект имеет единственный `[[Prototype]]`. И класс может расширить только один другой класс.
44

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

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

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

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)) является классом, который имеет методы, и мы можем использовать эти методы в других классах, не будучи родителем тех классов.
1212

13-
Другими словами *примесь* определяет методы, которые реализуют определенное поведение. Мы не используем его в одиночку, а используем его, чтобы добавить другим классам больше функционала.
13+
Другими словами, *примесь* определяет методы, которые реализуют определённое поведение. Мы не используем примесь саму по себе, она нужна, чтобы добавить другим классам больше функционала.
1414

1515
## Пример примеси
1616

17-
Простой путь создать примесь в JavaScript - это создать объект с использующимися методами, так что мы легко можем объединить их в прототип любого класса.
17+
Простой путь создания примеси в JavaScript - это создание объекта с полезными методами, так чтобы мы легко могли добавить их в прототип любого класса.
1818

19-
В примере ниже примесь `sayHiMixin` имеет методы для речи класса `User`:
19+
В примере ниже примесь `sayHiMixin` имеет методы для придания объектам класса `User` возможности вести разговор:
2020

2121
```js run
2222
*!*
@@ -43,11 +43,11 @@ class User {
4343
// копируем методы
4444
Object.assign(User.prototype, sayHiMixin);
4545

46-
// сейчас User можем сказать hi
46+
// сейчас User может сказать Hello
4747
new User("Dude").sayHi(); // Hello Dude!
4848
```
4949

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

5252
```js
5353
class User extends Person {
@@ -91,36 +91,36 @@ class User {
9191
// копируем методы
9292
Object.assign(User.prototype, sayHiMixin);
9393

94-
// сейчас User может сказать hi
94+
// сейчас User может сказать Hello
9595
new User("Dude").sayHi(); // Hello Dude!
9696
```
9797

9898
Обратите внимание, что мы вызвали родительский метод `super.say()` из `sayHiMixin` в прототипе другой примеси, а не в классе.
9999

100100
![](mixin-inheritance.png)
101101

102-
Это связано с тем, что методы из `sayHiMixin` имеют установку `[[HomeObject]]`. А `super` на самом деле означает `sayHiMixin.__ proto__`, а не `User.__ proto__`.
102+
Это связано с тем, что методы из `sayHiMixin` имеют установленное свойство `[[HomeObject]]`. А `super` на самом деле означает `sayHiMixin.__ proto__`, а не `User.__ proto__`.
103103

104-
## Примесь события
104+
## EventMixin
105105

106106
Сейчас давайте создадим примесь для реального случая.
107107

108-
Важная особенность при работе с объектами это работа с событиями.
108+
Важная особенность при работе с объектами - это работа с событиями.
109109

110-
То есть объект должен иметь метод для «генерации события», когда с ним происходит что-то важное, а другие объекты должны иметь возможность «считывать» такие события.
110+
То есть, объект должен иметь метод для "генерации события", когда с ним происходит что-то важное, а другие объекты должны иметь возможность "слушать" такие события.
111111

112-
Событие может иметь имя, необязательно, и связь между некоторыми дополнительными данными.
112+
Событие должно иметь имя и, опционально, какие-то дополнительные данные, ассоциированные с ним.
113113

114-
Например, объект `user` может генерировать события `"login"`, когда посетитель входит. А другой объект `calendar` может захотеть получать его события, чтобы загрузить календарь для вошедшего человека.
114+
Например, объект `user` может генерировать событие `"login"`, когда посетитель входит. А другой объект `calendar` может захотеть получать событие `"login"`, чтобы загрузить календарь для вошедшего пользователя.
115115

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

118-
События — это способ «поделиться информацией» со всеми, кто этого захочет. Они могут быть полезны в любом классе, поэтому давайте сделаем для них пример:
118+
События — это способ "поделиться информацией" со всеми, кто этого захочет. Они могут быть полезны в любом классе, поэтому давайте сделаем для них пример:
119119

120120
```js run
121121
let eventMixin = {
122122
/**
123-
* Опишем события, используя:
123+
* Подпишемся на событие, используя:
124124
* menu.on('select', function(item) { ... }
125125
*/
126126
on(eventName, handler) {
@@ -132,7 +132,7 @@ let eventMixin = {
132132
},
133133

134134
/**
135-
* Закроем событие, используя:
135+
* Отменим подписку, используя:
136136
* menu.off('select', handler)
137137
*/
138138
off(eventName, handler) {
@@ -146,27 +146,27 @@ let eventMixin = {
146146
},
147147

148148
/**
149-
* Создадим событие и прикрепим данные
149+
* Запустим событие и добавим к нему данные
150150
* this.trigger('select', data1, data2);
151151
*/
152152
trigger(eventName, ...args) {
153153
if (!this._eventHandlers || !this._eventHandlers[eventName]) {
154-
return; // без обработчиков для этого события
154+
return; // обработчиков для этого события нет
155155
}
156156

157-
// вызовем обработчиков
157+
// вызовем обработчики
158158
this._eventHandlers[eventName].forEach(handler => handler.apply(this, args));
159159
}
160160
};
161161
```
162162

163-
И так у нас 3 метода:
163+
Итак, у нас 3 метода:
164164

165-
1. `.on(eventName, handler)` -- назначили функцию `handler`, чтобы запустить событие с этим именем. И храним обработчиков в свойстве `_eventHandlers`.
165+
1. `.on(eventName, handler)` -- назначили функцию `handler`, чтобы обработать событие с заданным именем. Храним обработчики в свойстве `_eventHandlers`.
166166

167-
2. `.off(eventName, handler)` -- удаляем функцию из списка обработчиков.
167+
2. `.off(eventName, handler)` -- убираем функцию из списка обработчиков.
168168

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

171171
Использование:
172172

@@ -182,27 +182,25 @@ Object.assign(Menu.prototype, eventMixin);
182182

183183
let menu = new Menu();
184184

185-
// Вызовем выбранный обработчик:
185+
// Вызовем обработчик на событие "select":
186186
*!*
187-
menu.on("select", value => alert(`Value selected: ${value}`));
187+
menu.on("select", value => alert(`Выбранное значение: ${value}`));
188188
*/!*
189189

190-
// Запустили событие => покажет выбранное значение: 123
191-
menu.choose("123"); // значение выбрано
190+
// Запустили событие => будет показано "Выбранное значение: 123"
191+
menu.choose("123"); // выбранное значение
192192
```
193193

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

196-
И `eventMixin` может добавить поведение в любой класс какой мы хотим, без вмешательства в цепочку наследования.
196+
И `eventMixin` может добавить такое поведение в любой класс без вмешательства в цепочку наследования.
197197

198198
## Итого
199199

200200
*Примесь* -- общий термин в объектно-ориентированном программировании: класс, который содержит в себе методы для других классов.
201201

202-
В других языках, как Python разрешается создавать примеси используя множественное наследование. JavaScript не поддерживает множественное наследование, но с помощью примесей мы можем реализовать это скопировав методы в прототип.
202+
В других языках (например, Python) разрешается создавать примеси, используя множественное наследование. JavaScript не поддерживает множественное наследование, но с помощью примесей мы можем реализовать нечто похожее, скопировав методы в прототип.
203203

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

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

1-js/09-classes/07-mixins/head.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
let eventMixin = {
33

44
/**
5-
* Subscribe to event, usage:
5+
* Подпишемся на событие, используя:
66
* menu.on('select', function(item) { ... }
77
*/
88
on(eventName, handler) {
@@ -14,7 +14,7 @@
1414
},
1515

1616
/**
17-
* Cancel the subscription, usage:
17+
* Отменим подписку, используя:
1818
* menu.off('select', handler)
1919
*/
2020
off(eventName, handler) {
@@ -28,15 +28,15 @@
2828
},
2929

3030
/**
31-
* Generate the event and attach the data to it
31+
* Запустим событие и добавим к нему данные
3232
* this.trigger('select', data1, data2);
3333
*/
3434
trigger(eventName, ...args) {
3535
if (!this._eventHandlers || !this._eventHandlers[eventName]) {
36-
return; // no handlers for that event name
36+
return; // обработчиков для этого события нет
3737
}
3838

39-
// call the handlers
39+
// вызовем обработчики
4040
this._eventHandlers[eventName].forEach(handler => handler.apply(this, args));
4141
}
4242
};

0 commit comments

Comments
 (0)