如何在JavaScript中定义枚举?
TypeScript的枚举是许多其他语言中非常方便的功能。然而,JavaScript目前没有类似的概念。但是,JavaScript在灵活性方面弥补了语法糖的不足。
定义枚举最简单的方法是使用Object.freeze()
与普通对象结合使用。这将确保枚举对象不可变。
const daysEnum = Object.freeze({
monday: 0,
tuesday: 1,
wednesday: 2,
thursday: 3,
friday: 4,
saturday: 5,
sunday: 6
});
更进一步,可以将逻辑提取到一个具有可变数量参数并生成冻结对象的函数中。这种技术几乎没有什么好处,因此更好的选择是创建一个简单的class
。毕竟,枚举在面向对象编程语言中更常见,所以这听起来很合适。
Enum
类只需要一个带有可变数量参数的constructor
。它的工作是将每个键添加到枚举对象并冻结新创建的实例。一个潜在的增强是提供对枚举值的字符串访问。显然,可以使用Object.keys()
来实现这一点,但是命名方法可能会与枚举的某个值冲突,更不用说方法会污染结果了。
在这里使用ES6符号是显而易见的解决方案,因为它不会污染Object.keys()
的结果,也永远不会与枚举中的任何值冲突。更进一步,Symbol.iterator
将是一个很好的选择,因为它允许将枚举视为可迭代对象,并使其更加有用。将所有这些组合在一起,这是我的Enum
类及其使用方法:
```js class Enum { constructor(...keys) { keys.forEach((key, i) => { this[key] = i; }); Object.freeze(this); }
*Symbol.iterator { for (let key of Object.keys(this)) yield key; } }
const daysEnum = new Enum( 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' );
const days = [...daysEnum]; // 将枚举值转换为字符串的数组