¿Para qué son los getters y setters en las clases ECMAScript 6?


Estoy confundido en cuanto a cuál es el punto de getters y setters en las clases ECMAScript 6. ¿Cuál es el propósito? A continuación se muestra un ejemplo al que me refiero:

class Employee {

    constructor(name) {
        this._name = name;
    }

    doWork() {
        return `${this._name} is working`;
    }

    get name() {
        return this._name.toUpperCase();
    }

    set name(newName){
        if(newName){ 
            this._name = newName;
        }
    }
}
Author: dakab, 2015-01-29

3 answers

Estos setter y getter le permiten usar las propiedades directamente (sin usar el paréntesis)

var emp = new Employee("TruMan1");

if (emp.name) { 
  // uses the get method in the background
}

emp.name = "New name"; // uses the setter in the background

Esto es solo para establecer y obtener el valor de la propiedad.

 91
Author: David Laberge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 22:46:12

Los getters y setters en ES6 tienen el mismo propósito que en otros idiomas... incluido ES5. ES5 ya permite getters y setters vía Object.defineProperty, aunque son menos limpios y más engorrosos de usar.

Efectivamente, los getters y setters le permiten usar la notación de acceso de propiedad estándar para lecturas y escrituras mientras todavía tiene la capacidad de personalizar cómo se recupera y se mutaen la propiedad sin los métodos getter y setter explícitos necesarios.

En el La clase de empleado anterior, esto significaría que podría acceder a la propiedad name de esta manera:

console.log(someEmployee.name);

se vería como un acceso de propiedad normal, pero en realidad llamaría a toUpperCase en el nombre antes de devolverlo. Del mismo modo, haciendo esto:

someEmployee.name = null;

Accedería al setter, y no modificaría la propiedad interna _name debido a la cláusula guard introducida en el setter de name.

Ver también la pregunta general ¿Por qué usar getters y setters? para más la información sobre por qué es útil poder modificar la funcionalidad de acceso de miembros.

 40
Author: Alexis King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:44

Los getters y setters de ES6 tienen una motivación sustancialmente diferente a conceptos similares en Java.

En Java, los getters y setters permiten a una clase definir un JavaBean. El punto de getters y setters es que permite al bean tener una "interfaz" completamente ortogonal a partir de la implícita en los campos públicos. Así que puedo tener un campo " nombre "que NO es una propiedad JavaBean, y puedo tener una propiedad JavaBean" dirección " que NO es un campo.

Las propiedades JavaBean son también "detectable" por miles de frameworks (Hibernate, por ejemplo) a través de Java reflection. Por lo tanto, los getters y setters son parte de un método estándar para "exponer" las propiedades del frijol.

Los getters y setters, al ser funciones, también tienen el valor de "abstraer" la implementación. Puede ser un campo o un valor calculado ("sintético"). Así que si tengo una propiedad bean llamada "código postal", que comienza como cadena almacenada. Ahora supongamos que quiero cambiarlo para que sea un valor calculado de la dirección / ciudad / estado?

Si utilizo un campo, este código se rompe:

      String zipcode = address.zipcode();

Pero si uso un getter, esto no se rompe:

      String zipcode = address.getZipcode();

JavaScript no tiene nada como JavaBeans. Por lo que he leído, el valor pretendido de GET y SET se limita a las propiedades "sintéticas" (calculadas).

Pero es algo mejor que java en que mientras Java no le permite convertir de forma compatible un "campo" a un método, ES6 GET and SET lo permite.

Que es, si tengo:

       var zipcode = address.zipcode;

Si cambio zipcode de ser una propiedad de objeto estándar a un getter, el código anterior ahora llama a la función GET.

Tenga en cuenta que si no incluyo GET en la definición, esto NO invocaría el método zipcode GET. En su lugar, simplemente asignaría la función zipcode al var.

Así que creo que estas son algunas distinciones importantes para entender entre Java y JavaScript ES6 getters y setters.

 0
Author: DaBlick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 15:59:25