如何在JavaScript中创建常量

11

我正在设计一些类,并且对于某些数据,我想使用常量字段。

现在,像往常一样,IE不支持关键字const,因此

const T = 10;

无法工作。

我可以通过__defineGetter____defineSetter__创建属性来模拟,但是,像往常一样,IE不支持该语法(IE 8具有Object.defineProperty,但无法在自定义对象上使用)。

有什么想法吗?

5个回答

11

"没有解决方案" 确实是最安全的解决方案。目前,在JavaScript中创建常量没有一个好的机制,但如果您建立一个约定(使用 ALL CAPS FOR CONSTS 来识别它们),并且不要自行覆盖它们,那么您自己的常量将是安全的。

如果您正在编写一个公共库,并且非常担心有人修改某个值,则可以使用仅对您自己的代码可访问的私有变量来控制作用域的函数:

(function() {
    var MY_CONSTANT = 42;
    alert(MY_CONSTANT); // alerts "42"
    ...do other stuff in here...
})();
alert(MY_CONSTANT); // alerts "undefined" because MY_CONSTANT is out of scope here

如果开发人员能够在JavaScript中读取一个值,那么该开发人员就可以修改该值。


是的,唯一跨浏览器兼容定义常量的方法是使用闭包并提供访问该变量的方法(就像它有一个私有变量一样...)。但我的问题是要为开发人员提供从常量中获取值的方法,例如obj.MY_CONSTANT,因此您后面的解决方案不适用。因此,最终,对于那些可怕且不兼容的浏览器(包括IE 8版本),我们开发人员必须始终找到可怜的解决方案并浪费时间。微软什么时候才能理解Web开发人员想要标准呢? - xdevel2000
通常情况下,当有人想抱怨微软和标准时,我不会反对,但在这种情况下,似乎是不公平的,因为JavaScript常量不是任何规范的一部分,它们是Mozilla特有的。 - Prestaul
是的,但我指的是“事实上的标准”,例如WebKit引擎(Chrome等)支持const、__defineGetter__等。此外,XMLHttpRequest对象不是w3C标准(它是由M$发明的),但已被所有人采用。 - xdevel2000

7

Javascript中有一个freeze()方法,可用于创建实际常量。

用法:

    var consts = {};                    // Object to store all constants
    consts.MY_CONSTANT= 6;
    Object.freeze(consts);              // Make the consts truly read only
    consts.MY_CONSTANT= 7;              // Trying to do this will give error

7

Object.defineProperty 是您想要的。

例如:

var obj = {};

Object.defineProperty(obj, 'key', {
  enumerable: false,
  configurable: false,
  writable: false,
  value: 'static'
});

将"obj.key"定义为"value:static",并使其只读。

  • Enumerable表示在枚举对象属性时是否显示(或不显示)。
  • Writable表示如果要设置为只读,则应设置为false。不可写入。
  • 如果您不希望从对象中删除它,则将Configurable设置为false。

本质上,将它们全部设置为false,您正在创建对象的常量。默认情况下它们都是false。

因此,实际上是这样做的:

Object.defineProperty(obj, 'property', { value: 'value'});

将创建一个常数在'obj'上,称为'property',其值为'value'。或者您可以这样做:

function setConstant(obj, key, value)
{
    Object.defineProperty(obj, key, {value: value });
}

var obj = {};
setConstant(obj, "constantName", "constantValue");

这将使它更易读。


3

虽然这是一个老问题,但是如今你可以简单地使用以下方法:

const MY_CONST = 10;

来自MDN:

const 声明创建一个对值的只读引用。 它不意味着该值是不可变的,而是变量标识符不能被重新分配。

所有主流浏览器都已支持


2
请注意,将某个变量定义为常量只是确保它无法被重写。
如果你真的无法将一个变量定义成常量,那就把它定义成变量,并在设置它的值后不再修改。我猜你自己写这段代码,所以你可以确保不会把它覆盖掉...
显然不是最理想的方法,但应该可行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接