我正在撕掉我的头发以完成这项工作......特别是对于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。所以我几乎使用下划线来“隐藏”静态变量。
这对我很有帮助。我希望这是一个很好的方法 - 请告诉我,如果没有:)
答案 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"
};