在这种情况下,实现js getter的优雅方式是什么?

时间:2017-03-23 16:27:13

标签: javascript

我有以下全局js模块:

var globals = (function (){
   var selectedReportPeriodId = 2;
   return{
      SelectedReportPeriodId : selectedReportPeriodId 
   };
})();

我的代码根据用户选择的报告期间选项设置SelectedReportPeriodId。我想在这个模块中添加一个js getter,它的功能如下:

function IsCurrentReportPeriod()
{
   return selectedReportPeriodId === 1
}

我希望下游代码像这样调用getter:

if(globals.IsCurrentReportPeriod)
{
   //do this
}

在上面的js模块中实现这个作为getter的优雅方法是什么?

更新#1

我试图像这样实施:

var globals = (function (){

   var selectedReportPeriodId;

   return{
      SelectedReportPeriodId : selectedReportPeriodId,
      get IsCurrentReportPeriod() {
         return selectedReportPeriodId == 1;
      }
   };
})();

我在之前的代码中设置globals.SelectedReportPeriodId = 1。我还在一个方法中设置了一个断点,并设置了一个globals.SelectedReportPeriodId的监视,它返回1.但是,globals.IsCurrentReportPeriod在这个代码下面的行中返回false,所以我定义的getter似乎没有按预期工作。有什么建议吗?

更新#2

selectedReportPeriodId初始化为值2.我猜测这可能是getter在设置更新值后看到selectedReportPeriodId = 2而不是1的原因。对此有什么好的解决方案?我是否应该为selectedReportPeriodId制作一个getter,它使用一些条件逻辑而不是用硬编码值初始化?

3 个答案:

答案 0 :(得分:0)

return{
      SelectedReportPeriodId : selectedReportPeriodId,
      IsCurrentReportPeriod : function () {
          return selectedReportPeriodId === 1
      }
};

但你的电话必须如下:

if (globals.IsCurrentReportPeriod()) {
}

答案 1 :(得分:0)

最直接,最简单的解决方案是让代码设置globals.IsCurrentReportPeriod属性而不是selectedReportPeriodId变量。但如果你必须使用吸气剂,你可以这样做:

var globals = (function (){
    var selectedReportPeriodId;
    return {
        get IsCurrentReportPeriod() {
            return selectedReportPeriodId === 1;
        }
    };
})();

答案 2 :(得分:0)

您可以尝试这种创建模块的方式:



var Globals = Globals || {};

(function(exports) {
   var selectedReportPeriodId = 1,
       otherPrivateVariable = 'private !';
   
   exports.getIsCurrentReportPeriod = function() {
     return (selectedReportPeriodId === 1);
   };

   function thisIsAPrivateMethod() {
   }

})(Globals);

alert(Globals.getIsCurrentReportPeriod())