首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在现代javascript (es2015)中将enum实现为不可变类

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

Stack Overflow用户
提问于 2015-11-30 14:31:31
回答 2查看 892关注 0票数 4

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

代码语言:javascript
复制
class AlphabetEnum{
  static get A(){
     return 'a';
  },
  static get B(){
     return 'b';
  }
 ...
}

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

因此,我梦想有这样的东西:

代码语言:javascript
复制
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();
      },
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-30 14:43:59

上一堂课是没有意义的。您不需要带有静态getter的函数。你只想要一个不变的对象--这很简单:

代码语言:javascript
复制
const AlphabetEnum = Object.freeze({
    A: "a",
    B: "b",
    …
});

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

代码语言:javascript
复制
const AlphabetEnum = {};
for (let i=0; i<26; i++)
    AlphabetEnum[String.fromCharCode(65+i)] = String.fromCharCode(97+i);
Object.freeze(AlphabetEnum);
票数 6
EN

Stack Overflow用户

发布于 2015-11-30 14:37:56

在ES5中,您可以采用同样的方式,使用Object.defineProperty

代码语言:javascript
复制
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。在这种情况下,您还可以使用普通对象:

代码语言:javascript
复制
var AlphabetEnum = {};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34000978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档