【问题标题】:How to create a constant in javascript如何在javascript中创建一个常量
【发布时间】:2009-07-14 13:06:21
【问题描述】:

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

现在,像往常一样,IE 不支持 key const 所以

const T = 10;

不工作。

我可以通过__defineGetter____defineSetter__ 创建一个属性来模仿它,但是 , AS USUAL,IE 不支持该语法(IE 8 有 Object.defineProperty 但不适用于自定义对象)。

有什么想法吗?

【问题讨论】:

    标签: javascript constants


    【解决方案1】:

    “没有解决方案”确实是最安全的解决方案。目前在 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 版本)糟糕且不兼容的浏览器,我们开发人员必须始终找到糟糕的解决方案并浪费我们的时间。什么时候 M$ 会明白网络开发者想要标准?????
    • 当有人想抱怨 M$ 和标准时,我通常不会反对,但在这种情况下,这似乎不公平,因为 javascript 常量不是任何规范的一部分,它们是 Mozilla 特定的。
    • 是的,但我与“标准事实上”有关,例如支持 const、defineGetter 等。通过 webKit 引擎(Chrome 等)。 XMLHttpRequest 对象也不是 w3C 标准(它是由 M$ 发明的),但已被所有人采用。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      Object.defineProperty 是你想要的。

      例如:

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

      将用值定义“obj.key”:“静态”,它将是只读的。

      • 可枚举表示在枚举对象的属性时会显示(或不显示)。
      • 可写意味着如果你希望它是只读的,你会说假。不可写。
      • 如果您不希望它从对象中删除,可配置为 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");
      

      会让它非常易读。

      【讨论】:

        【解决方案4】:

        老问题,但现在您可以简单地使用:

        const MY_CONST = 10;
        

        来自MDN

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

        Supported by 已经是所有主要浏览器了。

        【讨论】:

          【解决方案5】:

          请注意,将某些内容定义为常量实际上只是确保它不会被覆盖。

          如果你真的不能将某个东西定义为常量,那么只需将它定义为一个变量并设置一次它的值。我假设您正在编写代码,因此您可以确保不会覆盖它...

          显然不理想,但应该可以。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-03
            • 2012-10-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多