我正在尝试编写一些代码,允许我根据我使用的变量名检索整数值。但是,我试图使整数值成为最终值或无法更改的值。我已经放置了一些代码,允许我检索值,如上所述。任何人都可以告诉我,如果我可以将它们作为最终变量或其他东西吗?提前谢谢。
(function() {
// Create the global, and also give ourselves a convenient alias for it (`mod`)
window.MyModule = {
RED: "#FF0000",
BLUE: "#0000FF",
GREEN: "#00FF00",
};
})();
alert(MyModule.RED); // #FF0000
答案 0 :(得分:6)
免责声明:就安全性而言,最终变量是愚蠢的。在提高性能方面,因为js引擎可以更好地优化它,我怀疑它是否有所作为。
Benchmark表明性能没有明显提升。除了迂腐或伪安全之外,这实际上并没有用。
唯一的用例是让您的图书馆的一部分被冻结,以便用户不会在脚下拍摄。
使用ES5 Object.freeze
window.MyModule = Object.freeze({
RED: "#FF0000",
BLUE: "#0000FF",
GREEN: "#00FF00",
});
您可以(并且高度推荐)使用ES5-shim升级旧版/旧版浏览器以获得合规性。
您也可以使用Object.defineProperties
window.MyModule = {};
Object.defineProperties(window.MyModule, {
RED: { value: "#FF0000" },
BLUE: { value: "#0000FF" },
GREEN: { value: "#00FF00" }
});
有一个很好的快捷方式
window.MyModule = Object.create(null, {
RED: { value: "#FF0000" },
BLUE: { value: "#0000FF" },
GREEN: { value: "#00FF00" }
});
要小心将原型设置为null
,您可能需要将其设置为Object.prototype
答案 1 :(得分:4)
我知道这样做的最好/唯一方法是将RED,BLUE,GREEN等声明为函数并返回一个常量值,如下所示:
window.MyModule = {
RED: function() { return "#FF0000"; },
BLUE: function() { return "#0000FF"; },
GREEN: function() { return "#00FF00"; }
};
有人仍然可以覆盖函数来做一些不同的事情,但是从语义上来说这很难做 - 一个函数看起来更像是不应该被覆盖。
答案 2 :(得分:3)
您可以创建一个只读属性(即具有getter
但没有setter
的属性。
如果使用ECMAScript5,请查看Object.defineProperty()
。
某些早期版本支持object.__defineGetter__()
。