我需要一些帮助。我想用现代的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();
},
}
答案 0 :(得分:6)
一堂课没有任何意义。你不想要一个带静态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);
答案 1 :(得分:3)
你在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 = {};