Listado completo de tutoriales
ES6 - Definición de getters y setters |
En JavaScript disponemos ahora de la posibilidad de definir setters que son métodos que establecen un valor a una propiedad y getters que son métodos que rescatan un valor.
Para la definición de setters y getters disponemos de las palabras claves set y get.
La definición de propiedades con set y get nos permiten un mejor encapsulamiento de nuestra clase.
Veremos con un ejemplo sencillo la sintaxis para definir una propiedad definiendo su setter y getter.
Declarar una clase llamada Dado y definir un atributo llamado '_valor' que almacene el valor actual del dado. Luego definir los métodos set y get para poder fijar un nuevo valor al dado y conocer el valor actual.
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <script> class Dado { constructor() { this._valor = 1; } get valor() { return this._valor; } set valor(v) { this._valor = v; } imprimir() { document.write(this.valor + '<br>'); } } const dado1 = new Dado(); dado1.imprimir(); dado1.valor = 6; dado1.imprimir(); </script> </body> </html>
En el constructor definimos un atributo llamado _valor que almacena el valor 1:
constructor() { this._valor = 1; }
Definimos la propiedad 'valor' con sus respectivos 'set' y 'get':
get valor() { return this._valor; } set valor(v) { this._valor = v; }
El método get retorna el valor almacenado en el atributo '_valor' y el método set actualiza el valor almacenado en el atributo '_valor'.
Donde definimos un objeto de la clase Dado accedemos a la propiedad dado para cambiar su valor por medio de una asignación:
dado1.valor = 6;
Es decir que en dicha asignación se está ejecutando el método:
set valor(v) { this._valor = v; }
En principio podría pensarse que lo más fácil es acceder directamente al atributo _valor y olvidarnos del método set:
dado1._valor=6;
Pero si queremos luego mejorar la clase 'Dado' y hacerla más robusta, por ejemplo no dejar cargar valores inválidos para un dado podemos mejorar el método 'set' con la siguiente sintaxis:
set valor(v) { if (v>=1 && v<=6 && v%1===0) this._valor=v; else throw "Error en asignación de valor del dado"; }
Con ésta nueva implementación del método set solo almacenaremos valores válidos en el atributo _valor si llega un número entero comprendido entre 1 y 6. En el caso que llegue un valor con coma 1.4 que no está comprendido entre 1 y 6 luego no cumple la tercer condición que el resto de dividirlo sea cero.
Cualquiera de estas asignaciones detiene el programa con un error:
dado1.valor=7; dado1.valor=0; dado1.valor=3.4; dado1.valor='Hola';
Ahora podemos comprobar la ventaja de definir propiedades de acceso a una clase en lugar de acceder directamente a sus atributos.
Si accedemos directamente al atributos '_valor' luego no se genera un error si le asignamos:
dado1._valor=3.4;
Esto hace que nuestro programa sea más difícil de mantener y propenso a errores.
Vimos que llamamos al método set mediante una asignación, al método get lo llamamos directamente por su nombre:
const dado1=new Dado(); dado1.valor=5; document.write(dado1.valor);
Cuando llamamos al método write del objeto document estamos accediendo al método get del objeto dado1.