nodejs - javascript class getters and setters
¿Para qué sirven los getters y setters en las clases de ECMAScript 6? (3)
Estoy confundido sobre cuál es el punto de getters y setters en las clases de ECMAScript 6. ¿Cuál es el propósito? A continuación hay 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;
}
}
}
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.
Los captadores y establecedores de ES6 tienen una motivación sustancialmente diferente a conceptos similares en Java.
En Java, getters y setters permiten que una clase defina un JavaBean. El objetivo de getters y setters es que permite que el bean tenga una "interfaz" completamente ortogonal de la que implican los campos públicos. Por lo tanto, puedo tener un "nombre" de campo que NO sea una propiedad JavaBean, y puedo tener una "dirección" de propiedad JavaBean que NO sea un campo.
Las propiedades JavaBean también son "detectables" por miles de marcos (Hibernate, por ejemplo) a través de la reflexión de Java. Por lo tanto, getters y setters son parte de un método estándar para "exponer" las propiedades del bean.
Los getters y setters, siendo funciones, también tienen el valor de que "abstraen" la implementación. Puede ser un campo o un valor calculado ("sintético"). Entonces, si tengo una propiedad de bean llamada "zipcode", eso comienza como una cadena almacenada. Ahora supongamos que quiero cambiarlo para que sea un valor calculado a partir de la dirección / ciudad / estado.
Si uso 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. Hasta donde he leído, el valor previsto de GET y SET se limita a las propiedades "sintéticas" (computadas) mencionadas anteriormente.
Pero es algo mejor que Java, ya que mientras Java no le permite convertir de forma compatible un "campo" en un método, ES6 GET y SET lo permiten.
Es decir, si tengo:
var zipcode = address.zipcode;
Si cambio el código postal de 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 incluyera GET en la definición, esto NO invocaría el método GET de código postal. En cambio, simplemente asignaría la función de código postal a la var.
Así que creo que estas son algunas distinciones importantes para entender entre los captadores y establecedores de Java y JavaScript ES6.
Los getters y setters en ES6 tienen el mismo propósito que en otros idiomas ... incluido ES5.
ES5 ya permite getters y setters a través de
Object.defineProperty
, aunque son menos limpios y más engorrosos de usar.
Efectivamente, los captadores y establecedores le permiten usar la notación de acceso de propiedad estándar para lecturas y escrituras al mismo tiempo que tiene la capacidad de personalizar cómo se recupera y muta la propiedad sin los métodos de captador y configurador explícitos necesarios.
En la clase de empleado anterior, esto significaría que puede acceder a la propiedad de
name
esta manera:
console.log(someEmployee.name);
Se
vería
como un acceso de propiedad normal, pero en realidad llamaría a
toUpperCase
por 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 de protección introducida en el setter del
name
.
Vea también la pregunta general ¿ Por qué usar getters y setters? para obtener más información sobre por qué es útil poder modificar la funcionalidad del acceso de miembros.