模块中的常量或最终变量Javascript

时间:2011-06-20 20:03:51

标签: module const javascript final

我正在尝试编写一些代码,允许我根据我使用的变量名检索整数值。但是,我试图使整数值成为最终值或无法更改的值。我已经放置了一些代码,允许我检索值,如上所述。任何人都可以告诉我,如果我可以将它们作为最终变量或其他东西吗?提前谢谢。

(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

3 个答案:

答案 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" }
});

使用Object.create

有一个很好的快捷方式
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__()