-
Notifications
You must be signed in to change notification settings - Fork 227
Property getters and setters #194
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
84d9a86
62996fc
05a92e5
f9b2439
78810a6
1ddc056
e9b0519
0988760
3cee180
c19bdf8
67303a9
0cb05bb
fc70112
039e27b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -57,6 +57,18 @@ Desde fuera, una propiedad accesoria se parece a una normal. Esa es la idea de l | |
|
|
||
| A partir de ahora, "Nombre completo" sólo tiene un receptor. Si intentamos asignar "user.fullName", habrá un error. | ||
|
|
||
| ```js run | ||
| let user = { | ||
| get fullName() { | ||
| return `...`; | ||
| } | ||
| }; | ||
|
|
||
| *!* | ||
| user.fullName = "Test"; // Error (property has only a getter) | ||
| */!* | ||
| ``` | ||
|
|
||
| Arreglémoslo agregando un setter para " user.fullName": | ||
|
rainvare marked this conversation as resolved.
Outdated
|
||
|
|
||
| ```js run | ||
|
|
@@ -82,7 +94,6 @@ alert(user.name); // Alice | |
| alert(user.surname); // Cooper | ||
| ``` | ||
|
|
||
| Ahora tenemos una propiedad "virtual". Esta es legible y escribible, pero de hecho no existe. | ||
|
|
||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. El 30 nov, Ilya borró el smat header. Suele hacer esas cosas: por legibilidad, por redundante, por equivocado. |
||
| ```smart header="Accessor properties are only accessible with get/set" | ||
| Una vez que una propiedad se define con `get prop()` o `set prop()`, es una propiedad accesoria, ya no es una propiedad de los datos. | ||
|
|
@@ -93,12 +104,14 @@ Una vez que una propiedad se define con `get prop()` o `set prop()`, es una prop | |
| Y en cualquier caso no podemos "borrar" una propiedad accesoria. | ||
| ``` | ||
|
|
||
| Como resultado, tenemos una propiedad virtual `fullName` que puede leerse y escribirse. | ||
|
|
||
|
|
||
| ## Accessor descriptors | ||
|
|
||
| Los descriptores de las propiedades accesorias son different -- en comparación con las propiedades de los datos. | ||
| Los descriptores de las propiedades de acceso son diferentes de aquellos para las propiedades de los datos. | ||
|
|
||
| Para las propiedades de los accesorios, no hay funciones de "valor" y "escritura", sino de "get" y "set". | ||
| Para las propiedades de los accesorios, no hay cosas como "valor" y "escritura", sino de "get" y "set". | ||
|
|
||
| Así que un descriptor de accesorios puede tener: | ||
|
|
||
|
|
@@ -132,7 +145,7 @@ alert(user.fullName); // John Smith | |
| for(let key in user) alert(key); // name, surname | ||
| ``` | ||
|
|
||
| Tenga en cuenta una vez más que una propiedad puede ser un accesorio o una propiedad de datos, no ambas. | ||
| Tenga en cuenta que una propiedad puede ser un accesorio (tiene métodos `get/set`) o una propiedad de datos (tiene un 'valor'), no ambas. | ||
|
|
||
| Si intentamos poner tanto " get" como " valor" en el mismo descriptor, habrá un error: | ||
|
rainvare marked this conversation as resolved.
Outdated
|
||
|
|
||
|
|
@@ -176,14 +189,16 @@ alert(user.name); // Pete | |
| user.name = ""; // El nombre es demasiado corto... | ||
| ``` | ||
|
|
||
| Entonces, el nombre es almacenado en la propiedad `_name`, y el acceso se hace a traves de getter y setter. | ||
|
|
||
| Técnicamente, el código externo todavía puede acceder al nombre directamente usando "usuario._nombre". Pero hay un acuerdo ampliamente conocido de que las propiedades que comienzan con un guión bajo "_" son internas y no deben ser manipuladas desde el exterior del objeto. | ||
|
|
||
|
|
||
| ## Using for compatibility | ||
|
|
||
| Una de las grandes ideas detrás de los getters y setters -- permiten tomar el control de una propiedad de datos "normal" y ajustarla en cualquier momento. | ||
| Una de los grandes usos de los getters y setters es que permiten tomar el control de una propiedad de datos "normal" y reemplazarla con getter y setter y así refinar su coportamiento. | ||
|
|
||
| Por ejemplo, empezamos a implementar objetos de usuario usando las propiedades de datos "nombre" y "edad": | ||
| Imagina que empezamos a implementar objetos usuario usando las propiedades de datos "nombre" y "edad": | ||
|
|
||
| ```js | ||
| function User(name, age) { | ||
|
|
@@ -211,7 +226,9 @@ Ahora, ¿qué hacer con el viejo código que todavía usa la propiedad de la "ed | |
|
|
||
| Podemos intentar encontrar todos esos lugares y arreglarlos, pero eso lleva tiempo y puede ser difícil de hacer si ese código está escrito por otras personas. Y además, la "edad" es algo bueno para tener en "usuario", ¿verdad? En algunos lugares es justo lo que queremos. | ||
|
|
||
| Añadiendo un getter para la "edad" se atenúa el problema: | ||
| Pues mantengámoslo. | ||
|
|
||
| Añadiendo un getter para la "edad" resuelve el problema: | ||
|
|
||
| ```js run no-beautify | ||
| function User(name, birthday) { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.