在现代javascript中实现enum作为不可变类(es2015)

implement enum as immutable class in modern javascript (es2015)

本文关键字:不可变 es2015 enum javascript 实现      更新时间:2023-09-26

我需要一些帮助。我想用现代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();
      },
    }

类毫无意义。你不想要一个带有静态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);

使用Object.defineProperty:时,您可以按照与ES5相同的方式进行操作

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 = {};