/**
 * Object.defineProperty but "lazy", 意思是這個值只在之後設置
 * 它是第一次檢索,而不是立即設置。
 *
 * @param {Object} obj 設置屬性的對象
 * @param {string} key 要設置的屬性的鍵
 * @param {Function} getValue 用於在需要時獲取值的函數。
 * @param {boolean} setter 是否應該允許 setter
 */
const defineLazyProperty = function(obj, key, getValue, setter = true) {
  常量集 = (值) =>
    Object.defineProperty(obj, key, {value, enumerable: true, writable: true});

  常量選項 = {
    可配置:真,
    可枚舉:真實,
    得到() {
      常量值 = getValue();

      設定值);

      返回值;
    }
  };

  如果(二傳手){
    選項.set = 設置;
  }

  返回 Object.defineProperty(obj, key, options);
};

導出默認 defineLazyProperty;