Skip to content

Commit 787647e

Browse files
committed
it fixes grammar mistakes
1 parent ba36b3a commit 787647e

File tree

1 file changed

+31
-38
lines changed

1 file changed

+31
-38
lines changed

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

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
11
# Mixins
22

3-
Em JavaScript, só podemos herdar de um único objeto. Pode existir apenas um único `[[Prototype]]` para um objeto. E uma classe pode estender apenas uma outra classe.
3+
Em JavaScript, só se pode herdar de um único objeto. Pode apenas existir um único `[[Prototype]]` para um objeto. E uma classe pode estender apenas uma outra classe.
44

55
Porém, algumas vezes isso parece limitante. Por exemplo, temos uma classe `StreetSweeper` e uma classe `Bicycle`, e queremos fazer uma mistura delas: uma classe `StreetSweepingBicycle`;
66

77
Ou temos uma classe `User` e uma classe `EventEmitter` que implementa a geração de eventos, e gostaríamos de adicionar a funcionalidade de `EventEmitter` à `User`, para que nossos usuários possam emitir eventos.
88

9-
Existe um conceito que pode ajudar aqui, chamado "mixins".
9+
Existe um conceito que nos pode ajudar aqui, chamado "mixins".
1010

1111
Como definido no Wikipedia, um [mixin](https://en.wikipedia.org/wiki/Mixin) é uma classe contendo métodos que podem ser usados por outras classes sem a necessidade de herdar dela.
1212

13-
Em outras palavras, um *mixin* fornece métodos que implementam um determinado comportamento, mas não o utilizamos sozinho, utilizamos ele para adicionar o comportamento a outras classes.
13+
Em outras palavras, um *mixin* fornece métodos que implementam um determinado comportamento, mas não é utilizado sozinho, nós o utilizamos para adicionar o comportamento a outras classes.
14+
1415
## Um exemplo de mixin
1516

16-
A maneira mais simples de implementar um mixin em JavaScript é criando um objeto com métodos úteis, para que possamos facilmente mesclá-los em um prototype de qualquer classe.
17+
A maneira mais simples de implementar um mixin em JavaScript é criando um objeto com métodos úteis, para que possamos facilmente mesclá-los em um prototype de outra classe.
1718

18-
Por exemplo, aqui onde o mixin `sayHiMixin` é usado para adicionar alguma "fala" para `User`:
19+
Por exemplo, aqui o mixin `sayHiMixin` é usado para adicionar alguma "fala" para `User`:
1920

2021
```js run
2122
*!*
2223
// mixin
2324
*/!*
2425
let sayHiMixin = {
2526
sayHi() {
26-
alert(`Hello ${this.name}`);
27+
alert(`Olá ${this.name}`);
2728
},
2829
sayBye() {
29-
alert(`Bye ${this.name}`);
30+
alert(`Adeus ${this.name}`);
3031
}
31-
};
32-
3332
*!*
3433
// Utilização:
3534
*/!*
@@ -43,10 +42,10 @@ class User {
4342
Object.assign(User.prototype, sayHiMixin);
4443

4544
// agora User pode dizer oi
46-
new User("Dude").sayHi(); // Hello Dude!
45+
new User("Dude").sayHi(); // Olá Dude!
4746
```
4847
49-
Não existe herança, mas uma simples cópia de método. Portanto, `User` pode herdar de uma outra classe e também incluir o mixin para "misturar" os métodos adicionais, assim:
48+
Não existe herança, mas uma simples cópia de métodos. Portanto, `User` pode herdar de outra classe e também incluir o mixin para "misturar" (mix-in) os métodos adicionais, assim:
5049
5150
```js
5251
class User extends Person {
@@ -56,7 +55,7 @@ class User extends Person {
5655
Object.assign(User.prototype, sayHiMixin);
5756
```
5857
59-
Mixins usar herança dentro deles mesmos.
58+
Mixins podem usar herança dentro deles mesmos.
6059
6160
Por exemplo, aqui `sayHiMixin` herda de `sayMixin`:
6261
@@ -74,10 +73,10 @@ let sayHiMixin = {
7473
*!*
7574
// chama o método pai
7675
*/!*
77-
super.say(`Hello ${this.name}`); // (*)
76+
super.say(`Olá ${this.name}`); // (*)
7877
},
7978
sayBye() {
80-
super.say(`Bye ${this.name}`); // (*)
79+
super.say(`Adeus ${this.name}`); // (*)
8180
}
8281
};
8382

@@ -86,41 +85,36 @@ class User {
8685
this.name = name;
8786
}
8887
}
89-
9088
// copia os métodos
9189
Object.assign(User.prototype, sayHiMixin);
9290

9391
// agora User pode dizer oi
94-
new User("Dude").sayHi(); // Hello Dude!
92+
new User("Dude").sayHi(); // Olá Dude!
9593
```
9694
95+
Observe que a chamada do método pai `super.say()` por `sayHiMixin` (nas linhas marcadas com `(*)`) procura pelo método no prototype desse mixin, não na classe.
9796
98-
Observe que a chamada do método pai `super.say()` por `sayHiMixin` (las linhas marcadas com `(*)`) procura pelo método no prototype desse mixin, não na classe.
99-
100-
Aqui o diagrama (veja a parte direita):
97+
Aqui está o diagrama (veja a parte direita):
10198
10299
![](mixin-inheritance.svg)
103100
104-
Isso porque os métodos `sayHi` e `sayBye` foram inicialmente criados em `sayHiMixin`. Portanto, mesmo que tenha sido copiados, suas propriedades internas `[[HomeObject]]` referencia a `sayHiMixin`, como mostrado na figura acima.
101+
Isso porque os métodos `sayHi` e `sayBye` foram inicialmente criados em `sayHiMixin`. Portanto, mesmo que tenham sido copiados, suas propriedades internas `[[HomeObject]]` referenciam a `sayHiMixin`, como mostrado na figura acima.
105102
106-
107-
Como `super` procura por métodos pais em `[[HomeObject]].[[Prototype]]`, isso significa que procura `sayHiMixin.[[Prototype]]`.
103+
Como `super` procura por métodos pais em `[[HomeObject]].[[Prototype]]`, isso significa que procura em `sayHiMixin.[[Prototype]]`.
108104
109105
## EventMixin
110106
111107
Vamos criar um mixin para a vida real.
112108
113-
Uma característica importante de muitos objetos do navegador (por exemplo) é que eles podem gerar eventos. Eventos são uma ótima maneira de "transmitir informação" para qualquer um que a quiser. Então, vamos criar um mixin que nos permita adicionar facilmente funções relacionadas a eventos a qualquer classe/objeto.
114-
115-
- O mixin vai fornecer um método `.trigger(name, [...data])` para "gerar um evento" quando algo importante acontecer com ele. O argumento `name` é o nome do evento, opcionalmente seguido de argumentos adicionais com dados do evento.
109+
Uma característica importante de muitos objetos do navegador (por exemplo) é que eles podem gerar eventos. Eventos são uma ótima maneira de "transmitir informação" para qualquer um que a quiser. Então, vamos criar um mixin que nos permita facilmente adicionar funções relacionadas a eventos a qualquer classe/objeto.
116110
117-
- Além do método `.on(name, handler)` que adiciona a função `handler` como ouvinte de eventos com o dado nome. Ele será chamado quando um evento com o dado `name` disparar, e irá obter os argumentos da chamada de `.trigger`
118-
119-
- ...E o método `.off(name, handler)` que remove o listener `handler`.
111+
- O mixin vai fornecer um método `.trigger(name, [...data])` para "gerar um evento" quando algo importante acontecer com ele. O argumento `name` é o nome do evento, e é opcionalmente seguido de argumentos provendo dados do evento.
112+
- E também o método `.on(name, handler)` que adiciona a função `handler` como ouvinte de eventos com o dado nome. Ela será chamada quando um evento com o dado `name` disparar, e irá obter os argumentos da chamada de `.trigger`
113+
- ...E o método `.off(name, handler)` que remove o ouvinte `handler`.
120114
121115
Após adicionar o mixin, um objeto `user` será capaz de gerar um evento `"login"` quando o visitante fizer login. Um outro objeto, digamos, `calendar` pode querer ouvir por tais eventos para carregar o calendário para a pessoa logada.
122116
123-
Ou, um `menu` pode gerar o evento `"select" quando um item do menu for selecionado`, e outros objetos podem atribuir manipuladores (handlers) para reagir aquele evento.
117+
Ou, um `menu` pode gerar o evento `"select"` quando um item do menu for selecionado`, e outros objetos podem atribuir manipuladores (handlers) para reagir àquele evento. E assim por diante.
124118

125119
Aqui está o código:
126120

@@ -153,24 +147,23 @@ let eventMixin = {
153147
},
154148
155149
/**
156-
* Gera o evento e anexa os dados a ele
150+
* Gera um evento com o nome e dados providenciados
157151
* this.trigger('select', data1, data2);
158152
*/
159153
trigger(eventName, ...args) {
160154
if (!this._eventHandlers?.[eventName]) {
161155
return; // sem manipuladores (handlers) para esse nome de evento
162156
}
163157
164-
// chama o manipulador de eventos (handler)
158+
// chama os manipuladores de eventos (handlers)
165159
this._eventHandlers[eventName].forEach(handler => handler.apply(this, args));
166160
}
167161
};
168162
```
169163

170-
- `.on(eventName, handler)` -- atribui a função `handler` para executar quando o evento com aquele nome ocorre. Tecnicamente, existe uma propriedade `_eventHandlers` que armazena um array de manipuladores de evento para cada nome de evento, e apenas o adiciona a lista.
171164

165+
- `.on(eventName, handler)` -- atribui a função `handler` para ser executada quando o evento com aquele nome ocorre. Tecnicamente, existe uma propriedade `_eventHandlers` que armazena um array de manipuladores de evento para cada nome de evento, e o método apenas adiciona o manipulador à lista.
172166
- `.off(eventName, handler)` -- remove a função da lista de manipuladores de evento.
173-
174167
- `.trigger(eventName, ...args)` -- gera o evento: todos os manipuladores de eventos de `_eventHandlers[eventName]` são chamados, com a lista de argumentos `...args`.
175168

176169
Utilização:
@@ -189,15 +182,15 @@ let menu = new Menu();
189182
190183
// adiciona um manipulador de eventos, para ser chamado na seleção:
191184
*!*
192-
menu.on("select", value => alert(`Value selected: ${value}`));
185+
menu.on("select", value => alert(`Valor selecionado: ${value}`));
193186
*/!*
194187
195-
// dispara o evento => o manipulador de evento acima executa e mostra:
196-
// Value selected: 123
188+
// dispara o evento => o manipulador de evento acima é executado e mostra:
189+
// Valor selecionado: 123
197190
menu.choose("123");
198191
```
199192

200-
Agora, se quisermos que qualquer código reaja á uma seleção de menu, podemos ouvir com `menu.on(...)`;
193+
Agora, se quisermos que qualquer código reaja a uma seleção do menu, podemos ouvir com `menu.on(...)`.
201194

202195
E o mixin `eventMixin` facilita a adição do tal comportamento para tantas classes quanto quisermos, sem interferir na cadeia de herança.
203196

@@ -209,4 +202,4 @@ Algumas outras linguagens permitem herança múltipla. JavaScript não suporta h
209202

210203
Podemos usar mixins como uma maneira de incrementar uma classe adicionando múltiplos comportamentos, como manipulação de eventos como vimos acima.
211204

212-
Mixins podem se tornar um ponto de conflito se eles acidentalmente sobrescreverem métodos existentes da classe. Então geralmente deve-se pensar bem sobre a nomenclatura de um mixin, para minimizar a probabilidade disso acontecer.
205+
Mixins podem se tornar num ponto de conflito se eles acidentalmente sobrescreverem métodos existentes na classe. Então geralmente deve-se pensar bem sobre a nomenclatura dos métodos de um mixin, para minimizar a probabilidade disso acontecer.

0 commit comments

Comments
 (0)