在现代javascript中实现enum作为不可变类(es2015)
implement enum as immutable class in modern javascript (es2015)
我需要一些帮助。我想用现代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 = {};
相关文章:
- 如何将不可变的js导入angular 2(alpha)
- JavaScript Array unshift() 以一种不可变的方式
- 将对象从另一个不可变的Map分配给Map是否意味着深度克隆
- 函数在不可变的js和redux存储中
- 如何在JS中创建对象的可变和不可变副本
- 使用动态键返回不可变状态
- 不可变的JS映射或列表
- 如何使用不可变表示此数组重新排序示例
- 不可变,在映射内更新不返回正确的对象
- 不可变的Chai断言错误,而预期的结果等于
- 使用扩展运算符和析构函数运算符修改不可变对象的最短方法是什么
- 如何在类似Om的不可变应用程序状态下对关系数据进行建模
- javascript中不可变的值
- 不可变的js修改所有嵌套的记录
- WebSQL:SQLResultSetRowList 中的返回行是不可变的
- 如何在不可变/反应文档页面上阅读代码示例
- 在不可变JS中更新列表中的对象
- Object.seal(Object.prototype)是否使所有对象不可变?
- 什么是不可变.js中的“所有者ID”
- 在现代javascript中实现enum作为不可变类(es2015)