【问题标题】:implement enum as immutable class in modern javascript (es2015)在现代 javascript (es2015) 中将枚举实现为不可变类
【发布时间】:2015-11-30 14:31:31
【问题描述】:

我需要一些帮助。我想用现代 javascript 实现 Enum。我希望它是不可变的,并认为它看起来像这样:

class AlphabetEnum{
  static get A(){
     return 'a';
  },
  static get B(){
     return 'b';
  }
 ...
}

但是,编写所有这些 getter 有点烦人。所以我很好奇 - 是否有机会使用计算方法名称和其他一些 es2015 功能来优化它。

结果我梦想拥有这样的东西:

let alph = [a, b, c, ..., z];
class AlphabetEnum{
      static get [some__clever_way_to_resolve_names_from_<alph>](){
         return some_clever_way_to_understand_what's_called();
      },
    }

【问题讨论】:

    标签: javascript enums ecmascript-6


    【解决方案1】:

    一个类是没有意义的。你不想要一个带有静态 getter 的函数。你只需要一个不可变的对象——这很简单:

    const AlphabetEnum = Object.freeze({
        A: "a",
        B: "b",
        …
    });
    

    当然,如果列出所有属性太麻烦,您也可以动态创建:

    const AlphabetEnum = {};
    for (let i=0; i<26; i++)
        AlphabetEnum[String.fromCharCode(65+i)] = String.fromCharCode(97+i);
    Object.freeze(AlphabetEnum);
    

    【讨论】:

      【解决方案2】:

      你会像在 ES5 中那样做,Object.defineProperty

      class AlphabetEnum {}
      
      ['a', 'b', 'c', ..., 'z'].forEach(letter => {
        Object.defineProperty(AlphabetEnum, letter.toUpperCase(), {
          get: () => letter,
          configurable: true, // remove this line if not needed / wanted
        });
      });
      

      但是,仅将 class 用于静态属性是一种反模式 IMO。在这种情况下,您也可以使用普通对象:

      var AlphabetEnum = {};
      

      【讨论】:

      • 你可能想删除configurable: true之后的逗号,否则很好的答案:)。
      • @Arg0n:我为什么要这样做?
      • 因为这样更漂亮! (这完全是事实,不是意见)v++
      • @FelixKling 嗯,我只是觉得它看起来像一个object,并且您会在最后一个属性之后出现逗号语法错误?但既然你说你不需要我猜你是对的。
      • @Arg0n:对象文字中的尾随逗号不是语法错误 :)
      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2018-05-22
      • 2022-10-25
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多