Javascript中的静态变量,只设置一次

时间:2011-03-24 18:33:07

标签: javascript oop variables setter getter

我正在撕掉我的头发以完成这项工作......特别是对于html5检测脚本。我想要一个只设置一次并且不能再次覆盖的变量。就是这样:

var StaticConfiguration = {};
StaticConfiguration.Main = {
    _html5: null
}
StaticConfiguration.getVariable = function(name) {
    return StaticConfiguration.Main["_" + name];
}
StaticConfiguration.setVariable = function(name, value) {
    if(StaticConfiguration.Main["_" + name] == null) {
        StaticConfiguration.Main["_" + name] = value;
    }
}

首先,我定义一个包含所有这些变量的全局对象StaticConfiguration - 在我的例子中,只是“html5”。我将它设置为null,因为我想在应用程序中设置它。为此,我打电话给

StaticConfiguration.setVariable("html5", "true");

然后就开始了。如果我尝试再次设置它,它会失败 - 当然,因为_html5不再是null。所以我几乎使用下划线来“隐藏”静态变量。

这对我很有帮助。我希望这是一个很好的方法 - 请告诉我,如果没有:)

5 个答案:

答案 0 :(得分:5)

首先,它是true,而不是"true" 所有字符串(除了空字符串)评估为true,包括字符串"false"

第二关,你真的需要保护这样的数据吗?无论如何,没有任何方法可以安全地运行用户的Javascript。像这样的保护总是有办法。如果违规代码真的受到关注,那么无论如何它都可以替换整个StaticConfiguration对象。

Matthew的代码是解决问题的更好方法,但它不遵循单例模式,而是需要实例化的类。如果你想要一个带有“静态”变量的单个对象,我会更喜欢这样做。

StaticConfiguration = new (function()
{
  var data = {}
  this.setVariable = function(key, value)
  {
    if(typeof data[key] == 'undefined')
    {
      data[key] = value;
    }
    else
    {
      // Maybe a little error handling too...
      throw new Error("Can't set static variable that's already defined!");
    }
  };

  this.getVariable = function(key)
  {
    if (typeof data[key] == 'undefined')
    {
      // Maybe a little error handling too...
      throw new Error("Can't get static variable that isn't defined!");
    }
    else
    {
      return data[key];
    }
  };
})();

个人旁注:我讨厌“他们自己的大括号”格式激情!

答案 1 :(得分:1)

看看Crockford关于Private Members in JavaScript的文章。你可以这样做:

var StaticConfiguration = (function() {
  var html5; /* this is private, i.e. not visible outside this anonymous function */

  return {
    getVariable: function(name) {
      ...
    },

    setVariable: function(name, value) {
      ...
    }
  };
)();

答案 2 :(得分:1)

怎么样:

var StaticConfiguration = new (function()
{
  var data = {}
  this.setVariable = function(key, value)
  {
    if(typeof data[key] == 'undefined')
    {
      data[key] = value;
    }
  };

  this.getVariable = function(key)
  {
    return data[key];
  };
})();

与其他答案类似,但仍允许任意键。与下划线解决方案不同,这是真正私密的。

答案 3 :(得分:1)

我有点好奇为什么你认为你必须在这个程度上保护数据不被覆盖。如果您正在检测浏览器,那么它不应该只执行一次吗?如果有人用无效数据覆盖它,那么我会认为它会在客户端实现中出现问题,而不是库代码 - 这有意义吗?

作为旁注,我对KISS原则非常重视,尤其是,当涉及到客户端脚本时。

答案 4 :(得分:0)

我知道我有点迟到了,但在这种情况下,我通常

var data;

if (data === undefined || //or some other value you expect it to start with{
data = "new static value"
};