/**
 * Object.defineProperty pero "perezoso", lo que significa que el valor solo se establece después
 * se recuperó la primera vez, en lugar de configurarse de inmediato.
 *
 * @param {Object} obj el objeto para establecer la propiedad en
 * @param {cadena} clave la clave para establecer la propiedad
 * @param {Función} getValue la función utilizada para obtener el valor cuando se necesita.
 * @param {boolean} setter si se debe permitir o no un setter
 * /
const defineLazyProperty = function(obj, key, getValue, setter = true) {
  const conjunto = (valor) =>
    Object.defineProperty(obj, clave, {valor, enumerable: verdadero, escribible: verdadero});

  opciones constantes = {
    configurable: verdadero,
    enumerable: cierto,
    conseguir() {
      valor constante = obtenerValor();

      valor ajustado);

      valor de retorno;
    }
  };

  si (colocador) {
    opciones.conjunto = conjunto;
  }

  devuelve Object.defineProperty(obj, clave, opciones);
};

exportar predeterminado defineLazyProperty;