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
Built-in classes like Array, Map and others are extendable also.
4
+
Classes nativas como Array, Map e outras também podem ser estendidas.
5
5
6
-
For instance, here`PowerArray`inherits from the native `Array`:
6
+
Por exemplo, aqui`PowerArray`herda do `Array` nativo:
7
7
8
8
```js run
9
-
//add one more method to it (can do more)
9
+
//adiciona mais um método (pode fazer mais)
10
10
classPowerArrayextendsArray {
11
11
isEmpty() {
12
12
returnthis.length===0;
@@ -21,20 +21,20 @@ alert(filteredArr); // 10, 50
21
21
alert(filteredArr.isEmpty()); // false
22
22
```
23
23
24
-
Please note a very interesting thing. Built-in methods like`filter`, `map`and others -- return new objects of exactly the inherited type `PowerArray`. Their internal implementation uses the object's`constructor`property for that.
24
+
Note uma coisa muito interessante. Métodos nativos, como`filter`, `map`e outros retornam novos objetos exatamente do tipo herdado `PowerArray`. Sua implementação interna usa a propriedade`constructor`do objeto para isso.
25
25
26
-
In the example above,
26
+
No exemplo acima,
27
27
```js
28
28
arr.constructor=== PowerArray
29
29
```
30
30
31
-
When`arr.filter()`is called, it internally creates the new array of results using exactly`arr.constructor`, not basic `Array`. That's actually very cool, because we can keep using `PowerArray`methods further on the result.
31
+
Quando`arr.filter()`é chamado, ele internamente cria o novo array de resultados usando exatamente`arr.constructor`, não o básico `Array`. Isso é realmente interessante, porque podemos continuar utilizando os métodos de `PowerArray`no resultado.
32
32
33
-
Even more, we can customize that behavior.
33
+
Ainda mais, podemos personalizar este comportamento.
34
34
35
-
We can add a special static getter`Symbol.species`to the class. If it exists, it should return the constructor that JavaScript will use internally to create new entities in `map`, `filter`and so on.
35
+
Podemos adicionar um getter estático especial chamado`Symbol.species`à classe. Se ele existir, deve retornar o construtor que o JavaScript usará internamente para criar novas entidades em `map`, `filter`e assim por diante.
36
36
37
-
If we'd like built-in methods like `map`or`filter`to return regular arrays, we can return `Array`in`Symbol.species`, like here:
37
+
Se quisermos que os métodos nativos como `map`ou`filter`retornem arrays regulares, podemos retornar `Array`em`Symbol.species`, como nesse exemplo:
38
38
39
39
```js run
40
40
classPowerArrayextendsArray {
@@ -43,7 +43,7 @@ class PowerArray extends Array {
43
43
}
44
44
45
45
*!*
46
-
//built-in methods will use this as the constructor
46
+
//métodos nativos usarão isso como o construtor
47
47
staticget [Symbol.species]() {
48
48
returnArray;
49
49
}
@@ -53,37 +53,37 @@ class PowerArray extends Array {
53
53
let arr =newPowerArray(1, 2, 5, 10, 50);
54
54
alert(arr.isEmpty()); // false
55
55
56
-
// filter creates new array using arr.constructor[Symbol.species] as constructor
57
-
let filteredArr =arr.filter(item=> item >=10);
56
+
// filter cria um novo array usando arr.constructor[Symbol.species] como constructor
57
+
let filteredArr =arr.filter(item=> item >=10);
58
58
59
59
*!*
60
-
// filteredArr is not PowerArray, but Array
60
+
// filteredArr não é PowerArray, mas Array
61
61
*/!*
62
62
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
63
63
```
64
64
65
-
As you can see, now`.filter`returns`Array`. So the extended functionality is not passed any further.
65
+
Como você pode ver, agora`.filter`retorna`Array`. Assim, a funcionalidade estendida não é repassada adiante.
66
66
67
-
```smart header="Other collections work similarly"
68
-
Other collections, such as `Map` and `Set`, work alike. They also use `Symbol.species`.
Outras coleções, como `Map` e `Set, funcionam da mesma forma. Elas também utilizam `Symbol.species`.
69
69
```
70
70
71
-
## No static inheritance in built-ins
71
+
## Sem herança estática em objetos nativos
72
72
73
-
Built-in objects have their own static methods, for instance`Object.keys`, `Array.isArray` etc.
73
+
Objetos nativos possuem seus próprios métodos estáticos, por exemplo`Object.keys`, `Array.isArray`, etc.
74
74
75
-
As we already know, native classes extend each other. For instance, `Array`extends`Object`.
75
+
Como já sabemos, classes nativas se estendem. Por exemplo, `Array`estende de`Object`.
76
76
77
-
Normally, when one class extends another, both static and non-static methods are inherited. That was thoroughly explained in the article[](info:static-properties-methods#statics-and-inheritance).
77
+
Normalmente, quando uma classe estende outra, métodos estáticos e não estáticos são herdados. Isso foi explicado detalhadamente no artigo[](info:static-properties-methods#statics-and-inheritance).
78
78
79
-
But built-in classes are an exception. They don't inherit statics from each other.
79
+
Mas as classes nativas são uma exceção. Elas não herdam métodos estáticos uma das outras.
80
80
81
-
For example, both`Array`and`Date`inherit from`Object`, so their instances have methods from`Object.prototype`. But `Array.[[Prototype]]`does not reference `Object`, so there's no, for instance, `Array.keys()` (or`Date.keys()`) static method.
81
+
Por exemplo, tanto`Array`quanto`Date`herdam de`Object`, então suas instâncias têm métodos de`Object.prototype`. No entanto `Array.[[Prototype]]`não referencia `Object`, então não existe, por exemplo, um método estático `Array.keys()` (ou`Date.keys()`).
82
82
83
-
Here's the picture structure for `Date`and`Object`:
83
+
Aqui está a estrutura visual para `Date`e`Object`:
84
84
85
85

86
86
87
-
As you can see, there's no link between`Date`and`Object`. They are independent, only`Date.prototype`inherits from`Object.prototype`.
87
+
Como você pode ver, não existe ligação entre`Date`e`Object`. Eles são independentes, apenas`Date.prototype`herda de`Object.prototype`.
88
88
89
-
That's an important difference of inheritance between built-in objects compared to what we get with`extends`.
89
+
Essa é uma diferença importante de herança entre objetos nativos em comparação com o que obtemos com`extends`.
0 commit comments