He visto dos formas diferentes de implementar getters / setters en un patrón de módulo. Uno usa "defineProperty", mientras que el otro no. ¿Cuáles son las ventajas / desventajas de uno frente al otro?

var MyModule = (function() {

  var _val;

  var api = {
    get value1() {
      return _val
    },
    set value1(value) {
      _val = value
    }
  };

  Object.defineProperty(api, 'value2', {
    get: function() {
      return _val;
    },
    set: function(value) {
      _val = value
    }
  });
  return api;

}());

https://plnkr.co/edit/TbJSD4noZTew8II83eTH?p=preview

1
Skyler 12 ene. 2017 a las 18:23

3 respuestas

La mejor respuesta

Usando sintaxis getter crea una propiedad que , antes de ES2015, tenía que saber el nombre en el momento en que estaba escribiendo el código.

Object.defineProperty permite debe realizar lo mismo que lo anterior pero, incluso antes de ES2015, no requiere que conozca el nombre de la propiedad por adelantado. También le permite decidir si la propiedad es configurable, enumerable o editable, lo que no es posible utilizando la sintaxis get/set.

Para responder a su pregunta exacta: ninguno es mejor. Son para diferentes situaciones. La sintaxis get/set es más simple de leer y escribir, pero no es tan poderosa como Object.defineProperty.

2
Mike Cluck 12 ene. 2017 a las 15:30

Una "ventaja" de Object.defineProperty frente a la notación get / set es que defineProperty se puede usar en cualquier momento, incluso en objetos que ya se han creado (en los que no se puede usar la notación abreviada 'get'). Desde el mdn:

Para agregar un captador a un objeto existente más adelante en cualquier momento, use Object.defineProperty ().

-1
Scott Weaver 12 ene. 2017 a las 15:40

Como se menciona en la documentación.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

La adición de propiedades normales mediante la asignación crea propiedades que se muestran durante la enumeración de propiedades (para ... en bucle o método Object.keys), cuyos valores pueden modificarse y eliminarse. Este método permite que estos detalles adicionales se cambien de sus valores predeterminados. Por defecto, los valores agregados usando Object.defineProperty () son inmutables.

0
Michal Takáč 12 ene. 2017 a las 15:33