是否有类似于Object.defineProperty来定义变量?

时间:2015-03-05 20:53:58

标签: javascript

通过您导出的模块的公共方法访问私有变量很容易:

var makeAModule = function() {
    var _secret = 'Ssh!';
    var module = {
        tellMeYourSecret: function() {
            console.log(_secret);
        }
    };
    return module;
}

//  > var m = makeAModule();
//  > m.tellMeYourSecret();
//  Ssh!

有时我需要使用Object.defineProperty定义属性,这些属性由getter使用其他私有变量的值计算。但是,那些必须继续使用一个对象,所以我最终制作了一个私有对象来保存它们。如果我不将所有私人会员存放在该对象上,那么记住它上面有哪些道具以及哪些道具不是很混乱,所以我把所有东西放在那里:

var makeAModule = function() {
    var priv = {};
    priv._secret = 'Ssh!';
    Object.defineProperty(priv, 'secretLength', {
        get: function() { 
            return priv._secret.length; 
        }
    });
    var module = {
        tellMeYourSecret: function() {
            console.log(priv._secret);
        },
        howLongIsYourSecret: function() {
            console.log(priv._secretLength);
        }
    }
    return module;
}

//  > var m = makeAModule();
//  > m.howLongIsYourSecret();
//  4 

有没有办法定义一个变量(不附加到对象),其值是通过getter计算的?像这样:

var makeAModule = function() {
    var _secret = 'Ssh!';
    Object.defineVariable('_secretLength', {
        get: function() {
            return _secret.length;
        }
    })

    var module = {
        tellMeYourSecret: function() {
            console.log(_secret);
        },
        howLongIsYourSecret: function() {
            console.log(_secretLength);
        }
    }
    return module;
}

1 个答案:

答案 0 :(得分:0)

不直接。

但是,您可以将其设置为window的属性,从而使其成为全局变量。但是不建议使用全局变量,特别是如果它们是秘密的。



var makeAModule = function() {
  var priv = {};
  priv._secret = 'Ssh!';
  Object.defineProperty(window, '_secretLength', {
    get: function() { 
      return priv._secret.length; 
    }
  });
  return {
    tellMeYourSecret: function() {
      return _secret;
    },
    howLongIsYourSecret: function() {
      return _secretLength;
    }
  };
};
document.body.innerHTML =
  "Secret length: " + makeAModule().howLongIsYourSecret();




或者,您可以将getter定义为对象的属性,并使用with statement。请注意,with语句无法在严格模式下使用。



var makeAModule = function() {
  var priv = {};
  priv._secret = 'Ssh!';
  Object.defineProperty(priv, '_secretLength', {
    get: function() { 
      return priv._secret.length; 
    }
  });
  with(priv) {
    return {
      tellMeYourSecret: function() {
        return _secret;
      },
      howLongIsYourSecret: function() {
        return _secretLength;
      }
    };
  }
};
document.body.innerHTML =
  "Secret length: " + makeAModule().howLongIsYourSecret();