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

Constants or Final Variables in Modules Javascript

本文关键字:变量 常量 Javascript 模块      更新时间:2023-09-26

我正在尝试编写一些代码,这些代码允许我根据使用的变量名检索整数值。然而,我试图使整数值成为一个最终值或一些无法更改的值。我在下面放置了一些代码,这些代码允许我检索如上所述的值。有人能告诉我,我怎么可能把它们作为最终变量或其他什么吗?提前谢谢。

(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

免责声明:在安全常数/最终变量方面很愚蠢。在提高性能方面,因为js引擎可以对其进行更多的优化,我怀疑它是否会有所不同。

基准测试显示性能没有明显的增长。除了迂腐或伪安全之外,这实际上并没有什么用处。

唯一的用例是冻结部分库,这样用户就不会朝自己的脚开枪。

带ES5 Object.freeze

window.MyModule = Object.freeze({
    RED: "#FF0000",
    BLUE: "#0000FF",
    GREEN: "#00FF00",
});

您可以(强烈建议使用ES5填充程序升级旧版/旧版浏览器以实现合规性。

您也可以只使用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

我知道的最好/唯一的方法是将RED、BLUE、GREEN等声明为函数并返回一个常数值,如下所示:

window.MyModule = {
    RED: function() { return "#FF0000"; },
    BLUE: function() { return "#0000FF"; },
    GREEN: function() { return "#00FF00"; }
};

有些人仍然可以覆盖函数来做一些不同的事情,但在语义上更难做到——一个函数似乎更像是不应该被覆盖。

您可以创建只读属性(即具有getter但没有setter的属性)。

如果使用ECMAScript5,请检查Object.defineProperty()

一些早期版本支持object.__defineGetter__()