Skip to content

Commit 15fb132

Browse files
committed
1-09-05 Traducido 4
1 parent b91261d commit 15fb132

File tree

2 files changed

+34
-97
lines changed

2 files changed

+34
-97
lines changed
Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,40 @@
11

2-
# Extending built-in classes
2+
# Ampliación de clases integradas
33

4-
Built-in classes like Array, Map and others are extendable also.
4+
Las clases integradas como Array, Map y otras también son extensibles.
55

6-
For instance, here `PowerArray` inherits from the native `Array`:
6+
Por ejemplo, aquí `PowerArray` hereda del nativo `Array`:
77

88
```js run
9-
// add one more method to it (can do more)
9+
// se agrega un método más (puedes hacer más)
1010
class PowerArray extends Array {
1111
isEmpty() {
1212
return this.length === 0;
1313
}
1414
}
1515

1616
let arr = new PowerArray(1, 2, 5, 10, 50);
17-
alert(arr.isEmpty()); // false
17+
alert(arr.isEmpty()); // falso
1818

1919
let filteredArr = arr.filter(item => item >= 10);
2020
alert(filteredArr); // 10, 50
21-
alert(filteredArr.isEmpty()); // false
21+
alert(filteredArr.isEmpty()); // falso
2222
```
2323

24-
Please note a very interesting thing. Built-in methods like `filter`, `map` and others -- return new objects of exactly the inherited type. They rely on the `constructor` property to do so.
24+
Tenga en cuenta una cosa muy interesante. Métodos incorporados como `filter`, `map` y otros: devuelven nuevos objetos exactamente del tipo heredado `PowerArray`. Su implementación interna utiliza la propiedad `constructor` del objeto para eso.
2525

26-
In the example above,
26+
En el ejemplo anterior,
2727
```js
2828
arr.constructor === PowerArray
2929
```
3030

31-
So when `arr.filter()` is called, it internally creates the new array of results exactly as `new PowerArray`.
32-
That's actually very cool, because we can keep using `PowerArray` methods further on the result.
31+
Cuando se llama a `arr.filter()`, crea internamente la nueva matriz de resultados usando exactamente `arr.constructor`, no el básico `Array`. En realidad, eso es muy bueno, porque podemos seguir usando métodos `PowerArray` más adelante en el resultado.
3332

34-
Even more, we can customize that behavior.
33+
Aún más, podemos personalizar ese comportamiento.
3534

36-
There's a special static getter `Symbol.species`, if exists, it returns the constructor to use in such cases.
35+
Podemos agregar un `getter` estático especial `Symbol.species` a la clase. Si existe, debería devolver el constructor que JavaScript usará internamente para crear nuevas entidades en `map`, `filter` y así sucesivamente.
3736

38-
If we'd like built-in methods like `map`, `filter` will return regular arrays, we can return `Array` in `Symbol.species`, like here:
37+
Si queremos que los métodos incorporados como `map` o `filter` devuelvan matrices regulares, podemos devolver `Array` en `Symbol.species`, como aquí:
3938

4039
```js run
4140
class PowerArray extends Array {
@@ -44,39 +43,47 @@ class PowerArray extends Array {
4443
}
4544

4645
*!*
47-
// built-in methods will use this as the constructor
46+
// los métodos incorporados usarán esto como el constructor
4847
static get [Symbol.species]() {
4948
return Array;
5049
}
5150
*/!*
5251
}
5352

5453
let arr = new PowerArray(1, 2, 5, 10, 50);
55-
alert(arr.isEmpty()); // false
54+
alert(arr.isEmpty()); // falso
5655

57-
// filter creates new array using arr.constructor[Symbol.species] as constructor
56+
// filter crea una nueva matriz usando arr.constructor[Symbol.species] como constructor
5857
let filteredArr = arr.filter(item => item >= 10);
5958

6059
*!*
61-
// filteredArr is not PowerArray, but Array
60+
// filterArr no es PowerArray, sino Array
6261
*/!*
63-
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
62+
alert(filteredArr.isEmpty()); // Error: filterArr.isEmpty no es una función
6463
```
6564

66-
As you can see, now `.filter` returns `Array`. So the extended functionality is not passed any further.
65+
Como puede ver, ahora `.filter` devuelve `Array`. Por lo tanto, la funcionalidad extendida ya no se pasa.
6766

68-
## No static inheritance in built-ins
67+
```smart header="Other collections trabaja similarmente"
68+
Otras colecciones, como `Map` y `Set`, funcionan igual. También usan `Symbol.species`.
69+
```
70+
71+
## Sin herencia estática en incorporados
6972

70-
Built-in objects have their own static methods, for instance `Object.keys`, `Array.isArray` etc.
73+
Los objetos incorporados tienen sus propios métodos estáticos, por ejemplo, `Object.keys`, `Array.isArray`, etc.
7174

72-
And we've already been talking about native classes extending each other: `Array.[[Prototype]] = Object`.
75+
Como ya sabemos, las clases nativas se extienden entre sí. Por ejemplo, `Array` extiende `Object`.
7376

74-
But statics are an exception. Built-in classes don't inherit static properties from each other.
77+
Normalmente, cuando una clase extiende a otra, se heredan los métodos estáticos y no estáticos. Eso se explicó a fondo en el artículo [](info:static-properties-methods#statics-and-inheritance).
7578

76-
In other words, the prototype of built-in constructor `Array` does not point to `Object`. This way `Array` and `Date` do not have `Array.keys` or `Date.keys`. And that feels natural.
79+
Pero las clases integradas son una excepción. No heredan estáticos el uno del otro.
7780

78-
Here's the picture structure for `Date` and `Object`:
81+
Por ejemplo, tanto `Array` como `Date` heredan de `Object`, por lo que sus instancias tienen métodos de `Object.prototype`. Pero `Array.[[Prototype]]` no hace referencia a `Object`, por lo que no existe, por ejemplo, el método estático `Array.keys()` (o `Date.keys()`).
82+
83+
Aquí está la imagen, estructura para `Date` y `Object`:
7984

8085
![](object-date-inheritance.svg)
8186

82-
Note, there's no link between `Date` and `Object`. Both `Object` and `Date` exist independently. `Date.prototype` inherits from `Object.prototype`, but that's all.
87+
Como puede ver, no hay un vínculo entre `Date` y `Object`. Son independientes, solo `Date.prototype` hereda de `Object.prototype`.
88+
89+
Esa es una diferencia importante de herencia entre los objetos integrados en comparación con lo que obtenemos con 'extends`.
Lines changed: 1 addition & 71 deletions
Loading

0 commit comments

Comments
 (0)