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/06-advanced-functions/09-call-apply-decorators/article.md
+19-19Lines changed: 19 additions & 19 deletions
Original file line number
Diff line number
Diff line change
@@ -212,36 +212,36 @@ Para tornar tudo mais claro, veremos mais profundamente como `this` é passado a
212
212
2. Então quando `worker.slow(2)` é executado, o embrulhador recebe `2` como argumento e `this=worker` (é o objeto antes do ponto).
213
213
3. Dentro do embrulhador, assumindo que o resultado ainda não está memorizado, `func.call(this, x)` passa o `this` atual (`=worker`) e o argumento atual (`=2`) para o método original.
214
214
215
-
## Going multi-argument
215
+
## Passando vários argumentos
216
216
217
-
Now let's make `cachingDecorator`even more universal. Till now it was working only with single-argument functions.
217
+
Agora vamos tornar o `cachingDecorator`ainda mais universal. Até agora este estava trabalhando apenas com funções de um único argumento.
218
218
219
-
Now how to cache the multi-argument `worker.slow`method?
219
+
Agora, como memorizar o método `worker.slow`com vários argumentos?
220
220
221
221
```js
222
222
let worker = {
223
223
slow(min, max) {
224
-
return min + max; //scary CPU-hogger is assumed
224
+
return min + max; //assume-se que é assustadoramente devoradora de processamento
225
225
}
226
226
};
227
227
228
-
//should remember same-argument calls
228
+
//deve lembrar-se das chamadas com o mesmo argumento
229
229
worker.slow=cachingDecorator(worker.slow);
230
230
```
231
231
232
-
Previously, for a single argument`x`we could just `cache.set(x, result)`to save the result and`cache.get(x)`to retrieve it. But now we need to remember the result for a *combination of arguments*`(min,max)`. The native `Map`takes single value only as the key.
232
+
Anteriormente, para um único argumento,`x`poderíamos simplesmente `cache.set(x, result)`para guardar o resultado e`cache.get(x)`para recuperá-lo. Mas agora precisamos lembrar o resultado para uma *combinação de argumentos*`(min,max)`. O `Map`nativo recebe apenas um único valor como chave.
233
233
234
-
There are many solutions possible:
234
+
Existem muitas soluções possíveis:
235
235
236
-
1.Implement a new (or use a third-party) map-like data structure that is more versatile and allows multi-keys.
237
-
2.Use nested maps: `cache.set(min)`will be a `Map`that stores the pair`(max, result)`. So we can get`result`as`cache.get(min).get(max)`.
238
-
3.Join two values into one. In our particular case we can just use a string `"min,max"` as the `Map` key. For flexibility, we can allow to provide a *hashing function* for the decorator, that knows how to make one value from many.
236
+
1.Implementar uma nova estrutura de dados parecida com o mapa (ou usar uma estrutura de terceiros) que seja mais versátil e permita várias chaves.
237
+
2.Usar mapas aninhados: `cache.set(min)`será um `Map`que armazena o par`(max, result)`. Assim, podemos obter o`result`como`cache.get(min).get(max)`.
238
+
3.Juntar dois valores num só. No nosso caso particular, podemos usar uma sequência de caracteres `min,max` como chave do `Map`. Para maior flexibilidade, podemos permitir fornecer uma *função de baralhamento* para o decorador, que sabe como fazer um valor a partir de muitos.
239
239
240
-
For many practical applications, the 3rd variant is good enough, so we'll stick to it.
240
+
Para muitas aplicações práticas, a terceira variante é suficientemente boa, pelo que ficaremos por ela.
241
241
242
-
Also we need to pass not just `x`, but all arguments in `func.call`. Let's recall that in a `function()` we can get a pseudo-array of its arguments as`arguments`, so`func.call(this, x)`should be replaced with`func.call(this, ...arguments)`.
242
+
Também precisamos passar não apenas `x`, mas todos os argumentos na `func.call`. Lembremos que numa `func.call` podemos obter um pseudo-vetor dos seus argumentos como`arguments`, então`func.call(this, x)`deve ser substituído por`func.call(this, ...arguments)`.
alert( "Again "+worker.slow(3, 5) ); //o mesmo (memorizado)
281
281
```
282
282
283
-
Now it works with any number of arguments (though the hash function would also need to be adjusted to allow any number of arguments. An interesting way to handle this will be covered below).
283
+
Agora funciona com qualquer número de argumentos (embora a função de baralhar também precise de ser ajustada para permitir qualquer número de argumentos. Uma maneira interessante de lidar com isto será abordada mais adiante).
284
284
285
-
There are two changes:
285
+
Existem duas alterações:
286
286
287
-
-In the line `(*)`it calls `hash`to create a single key from `arguments`. Here we use a simple "joining" function that turns arguments`(3,5)`into the key `"3,5"`. More complex cases may require other hashing functions.
288
-
-Then`(**)`uses`func.call(this, ...arguments)`to pass both the context and all arguments the wrapper got (not just the first one) to the original function.
287
+
-Na linha `(*)`chama `hash`para criar uma única chave a partir de `arguments`. Neste caso usamos uma função simples de "junção" que transforma os argumentos`(3,5)`na chave `"3,5"`. Os casos mais complexos podem exigir outras funções de baralhamento.
288
+
-Então`(**)`usa`func.call(this, ...arguments)`para passar tanto o contexto quanto todos os argumentos que o embrulhador recebeu (não apenas o primeiro) para a função original.
0 commit comments