Skip to content

Commit c1c9c44

Browse files
authored
Merge pull request #446 from joaquinelio/protin
1-8-1 proto article - actualizacion
2 parents 0aac765 + 467b5e3 commit c1c9c44

File tree

1 file changed

+23
-17
lines changed
  • 1-js/08-prototypes/01-prototype-inheritance

1 file changed

+23
-17
lines changed

1-js/08-prototypes/01-prototype-inheritance/article.md

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ En JavaScript, los objetos tienen una propiedad oculta especial `[[Prototype]]`
1212

1313
![prototype](object-prototype-empty.svg)
1414

15-
El prototipo es un poco "mágico". Cuando queremos leer una propiedad de `object`, y falta, JavaScript la toma automáticamente del prototipo. En programación, tal cosa se llama "herencia prototípica". Muchas características geniales del lenguaje y técnicas de programación se basan en él.
15+
Cuando leemos una propiedad de `object`, y falta, JavaScript la toma automáticamente del prototipo. En programación esto se llama "herencia prototípica". Pronto estudiaremos muchos ejemplos de esta herencia y otras características interesantes del lenguaje que se basan en ella.
1616

1717
La propiedad `[[Prototype]]` es interna y está oculta, pero hay muchas formas de configurarla.
1818

@@ -31,15 +31,7 @@ rabbit.__proto__ = animal; // establece rabbit.[[Prototype]] = animal
3131
*/!*
3232
```
3333

34-
```smart header="`__proto__` es un getter/setter histórico para `[[Prototype]]`"
35-
Tenga en cuenta que `__proto__` *no es lo mismo* que `[[Prototype]] `. Es un getter/setter para este.
36-
37-
Existe por razones históricas. En lenguaje moderno, se reemplaza con las funciones `Object.getPrototypeOf/Object.setPrototypeOf` que también obtienen/establecen el prototipo. Estudiaremos las razones de eso y estas funciones más adelante.
38-
39-
Según la especificación, `__proto__` solo debe ser compatible con los navegadores, pero de hecho todos los entornos lo admiten, incluido el lado del servidor. Por ahora, como la notación `__proto__` es un poco más intuitiva, la usaremos en los ejemplos.
40-
```
41-
42-
Si buscamos una propiedad en `rabbit`, y falta, JavaScript automáticamente la toma de `animal`.
34+
Si buscamos una propiedad en `rabbit`, y falta, JavaScript la toma automáticamente de `animal`.
4335

4436
Por ejemplo:
4537

@@ -55,7 +47,7 @@ let rabbit = {
5547
rabbit.__proto__ = animal; // (*)
5648
*/!*
5749

58-
// // podemos encontrar ambas propiedades en conejo ahora:
50+
// Ahora podemos encontrar ambas propiedades en conejo:
5951
*!*
6052
alert( rabbit.eats ); // verdadero (**)
6153
*/!*
@@ -130,13 +122,28 @@ alert(longEar.jumps); // verdadero (desde rabbit)
130122

131123
![](proto-animal-rabbit-chain.svg)
132124

125+
Ahora, si leemos algo de `longEar` y falta, JavaScript lo buscará en `rabbit`, y luego en `animal`.
126+
133127
Solo hay dos limitaciones:
134128

135-
1. Las referencias no pueden ir en círculos. JavaScript arrojará un error si intentamos asignar `__proto__` en un círculo.
136-
2. El valor de `__proto__` puede ser un objeto o `nulo`. Otros tipos son ignorados.
129+
1. No puede haber referencias circulares. JavaScript arrojará un error si intentamos asignar `__proto__` en un círculo.
130+
2. El valor de `__proto__` puede ser un objeto o `null`. Otros tipos son ignorados.
137131

138132
También puede ser obvio, pero aún así: solo puede haber un `[[Prototype]]`. Un objeto no puede heredar desde dos.
139133

134+
135+
```smart header="`__proto__` es un getter/setter histórico para `[[Prototype]]`"
136+
Es un error común de principiantes no saber la diferencia entre ambos.
137+
138+
Tenga en cuenta que `__proto__` *no es lo mismo* que `[[Prototype]]`. `__proto__` es un getter/setter para `[[Prototype]]`. Más adelante veremos situaciones donde esto importa, por ahora solo tengámoslo en cuenta mientras vamos entendiendo el lenguaje JavaScript.
139+
140+
La propiedad `__proto__` es algo vetusta. Existe por razones históricas, el JavaScript moderno sugiere el uso de las funciones `Object.getPrototypeOf/Object.setPrototypeOf` en lugar de get/set del prototipo. Estudiaremos estas funciones más adelante.
141+
142+
Según la especificación, `__proto__` solo debe ser soportado por los navegadores. Aunque de hecho, todos los entornos incluyendo los del lado del servidor soportan `__proto__`, así que bastante seguro usarlo.
143+
144+
Como la notación `__proto__` es más intuitiva, la usaremos en los ejemplos.
145+
```
146+
140147
## La escritura no usa prototipo
141148
142149
El prototipo solo se usa para leer propiedades.
@@ -159,11 +166,11 @@ let rabbit = {
159166
160167
*!*
161168
rabbit.walk = function() {
162-
alert("¡Conejo! Rebota-rebota!");
169+
alert("¡Conejo! ¡Salta, salta!");
163170
};
164171
*/!*
165172
166-
rabbit.walk(); // ¡Conejo! Rebota-rebota!
173+
rabbit.walk(); // ¡Conejo! ¡Salta, salta!
167174
```
168175

169176
De ahora en adelante, la llamada `rabbit.walk()` encuentra el método inmediatamente en el objeto y lo ejecuta, sin usar el prototipo:
@@ -195,7 +202,7 @@ let admin = {
195202

196203
alert(admin.fullName); // John Smith (*)
197204

198-
// disparadores setter!
205+
// ¡Dispara el setter!
199206
admin.fullName = "Alice Cooper"; // (**)
200207

201208
alert(admin.fullName); // Alice Cooper , estado de admin modificado
@@ -294,7 +301,6 @@ let rabbit = {
294301
__proto__: animal
295302
};
296303

297-
298304
for(let prop in rabbit) {
299305
let isOwn = rabbit.hasOwnProperty(prop);
300306

0 commit comments

Comments
 (0)