碎片时间学编程「13」:如何在 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课程以及如何使用它的示例:

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]; // Array of the enum values as strings

你可能感兴趣的:(碎片时间学编程「13」:如何在 JavaScript 中定义枚举?)