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

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;
        }
    }
}
  • Es similar a aquellos en C#, si por casualidad usted conoce acerca de ella.
  • Relacionados: ¿Cuál es el argumento para el uso de ES6 getters y setters más de getProperty/setProperty convención?
  • Buen artículo para explicar este puede ser encontrado en: coryrylan.com/blog/javascript-es6-class-syntax «En nuestra clase tenemos encima un getter y setter para el nombre de nuestra propiedad. Usamos ‘_’ convenio para crear una copia de campo para almacenar el nombre de nuestra propiedad. Con esto cada vez que obtener o establecer que se llama, podría causar un desbordamiento de pila»… también habla de la variable de no ser realmente ‘privado’, pero existen numerosas nuevas maneras de crear privado vars en JS clases; mi favorito es sólo el uso de los Manuscritos, pero he utilizado el Símbolo enfoque demasiado
InformationsquelleAutor TruMan1 | 2015-01-29

3 Comentarios

  1. 98

    Estos setter y getter de permitir el uso de 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 sólo para establecer y obtener el valor de la propiedad.

    • ¿Te refieres a la propiedad en lugar del atributo? Poco confuso para mí
    • Buen ojo, @Krizzu. Existen atributos en JavaScript y completo cosas diferentes de las propiedades. La respuesta se refiere a las propiedades y no atributos. He editado la respuesta. No creo que la respuesta va a la mente. 🙂
    • No estoy muy seguro de que esto realmente es una ventaja, de alguna manera, se esconde la noción de uso de incubadoras/getters. Un cliente de una clase pueden pensar que se utiliza directamente las propiedades, donde no es su caso, decidir, pero estoy de acuerdo en que se adhiere la información/detalle ocultar principio. Tal vez si lo uso de esta forma se facilita su uso y sólo tengo que acostumbrarme a más…
    • Pueden pasar varios parámetros en un setter si es así ¿cómo usarlo? @David Laberge
    • Si desea crear setters y getters manualmente he aquí un buen ejemplo de la coryrylan.com/blog/javascript-es6-class-syntax Set: set name(newName) { this._name = newName; } Obtener: get name() { return this._name.toUpperCase(); }
  2. 45

    Getters y setters en ES6 sirven el mismo propósito que lo hacen en otros idiomas… incluyendo ES5. ES5 ya permite a los getters y setters a través de Objeto.defineProperty, aunque son menos limpio y más engorroso de usar.

    Efectivamente, getters y setters de permitir que usted utilice el estándar de acceso a la propiedad de la notación para las lecturas y escrituras, mientras que todavía tiene la capacidad de personalizar la forma en que la propiedad está recuperado y transformado sin el necesario explícita de los métodos getter y setter.

    De la clase Employee anterior, esto significaría que podría acceder a la name propiedad como esta:

    console.log(someEmployee.name);

    Sería mirada como una normal de acceso a la propiedad, pero que en realidad podría llamar toUpperCase en el nombre antes de devolverlo. Del mismo modo, hacer esto:

    someEmployee.name = null;

    tendrían acceso a la incubadora, y no modificar el interior _name de la propiedad a causa de la guardia de la cláusula introducida en name‘s setter.

    Véase también la pregunta general ¿Por qué utilizar getters y setters? para obtener más información acerca de por qué ser capaz de modificar la funcionalidad de acceso de los miembros es útil.

    • Explicación muy clara. Gracias!
  3. 1

    ES6 getters y setters muy diferente motivación de conceptos similares en Java.

    En Java, getters y setters permitir una clase para definir un JavaBean. El punto de getters y setters es que permite que el grano de tener una ortogonales «interfaz» de que implícita por campos públicos. Para que yo pueda tener un campo «nombre» que NO es un JavaBean propiedad, y puedo tener un JavaBean propiedad de «dirección» que NO es un campo.

    JavaBean propiedades son también «reconocible» por miles de marcos (Hibernate, por ejemplo) a través de la reflexión Java. Por lo tanto, getters y setters son parte de un método estándar para «exponer» bean propiedades.

    Getters y setters, siendo las funciones, también tiene el valor que ellos «abstracto» de la aplicación. Puede ser un campo o un calculada («sintético») de valor. Así que si tengo un bean propiedad denominada «codigopostal», que empieza como una cadena almacenada. Ahora supongamos que quiero a cambio es un valor calculado a partir de la dirección/ciudad/estado?

    Si puedo usar un campo, este código se rompe:

          String zipcode = address.zipcode();

    Pero si yo uso un getter, este no se rompe:

          String zipcode = address.getZipcode();

    Que JavaScript no tiene nada de JavaBeans. A lo que yo he leído, la intención de valor de GET y SET está limitado a la aforementions «sintético» (calculada) propiedades.

    Pero es algo mejor que la de java, en que, mientras que Java no permite la compatibilidad convertir un «campo» a un método, ES6 GET y SET permite que.

    Que es, si tengo:

           var zipcode = address.zipcode;

    Si puedo cambiar el código postal de ser un estándar de la propiedad del objeto a un getter, en el código anterior, ahora llama a la función GET.

    Nota de que si yo no incluyen OBTENER en la definición, esto NO puede invocar el código postal método GET. En su lugar, es simplemente asignar la función de código postal a la var.

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

Dejar respuesta

Please enter your comment!
Please enter your name here