JavaScript中的四种枚举方式( 三 )

mySize(即Sizes.Small)不等于new Sizes('small') 。
Sizes.Small和new Sizes('small'),即使具有相同的#value,也是不同的对象实例 。
优缺点基于类的枚举不能受到保护,以防止覆盖或访问不存在的枚举具名常量 。
class Sizes {static Small = new Sizes('small')static Medium = new Sizes('medium')static Large = new Sizes('large')#valueconstructor(value) {this.#value = https://www.isolves.com/it/cxkf/yy/js/2023-05-22/value}toString() {return this.#value}}const size1 = Sizes.medium// a non-existing enum value can be accessedconst size2 = Sizes.Medium = 'foo' // enum value can be overwritten accidentally但你可以控制新实例的创建,例如,通过计算在构造函数内创建了多少个实例 。然后在创建超过3个实例时抛出一个错误 。
当然,最好让你的枚举实现尽可能的简单 。枚举的目的是为了成为普通的数据结构 。
总结在JavaScript中,有4种创建枚举的好方法 。
最简单的方法是使用一个普通的JavaScript对象:
const MyEnum = {Option1: 'option1',Option2: 'option2',Option3: 'option3'}普通的对象枚举适合小型项目或快速演示 。
第二种选择,如果你想保护枚举对象不被意外覆盖,则可以使用冻结的对象:
const MyEnum = Object.freeze({Option1: 'option1',Option2: 'option2',Option3: 'option3'})冻结的对象枚举适合于中型或大型项目,你要确保枚举不会被意外地改变 。
第三种选择是代理方法:
export function Enum(baseEnum) {return new Proxy(baseEnum, {get(target, name) {if (!baseEnum.hasOwnProperty(name)) {throw new Error(`"${name}" value does not exist in the enum`)}return baseEnum[name]},set(target, name, value) {throw new Error('Cannot add a new value to the enum')}})} import { Enum } from './enum'const MyEnum = Enum({Option1: 'option1',Option2: 'option2',Option3: 'option3'})代理枚举适用于中型或大型项目,以更好地保护你的枚举不被覆盖或访问不存在的命名常量 。
代理的枚举是我个人的偏好 。
第四种选择是使用基于类的枚举,其中每个命名的常量都是类的实例,并作为类的静态属性被存储:
class MyEnum {static Option1 = new MyEnum('option1')static Option2 = new MyEnum('option2')static Option3 = new MyEnum('option3')#valueconstructor(value) {this.#value = https://www.isolves.com/it/cxkf/yy/js/2023-05-22/value}toString() {return this.#value}}如果你喜欢类的话,基于类的枚举是可行的 。然而,基于类的枚举比冻结的或代理的枚举保护得更少 。
你还知道哪些在JavaScript中创建枚举的方法?
本文译自:https://dmitripavlutin.com/javascript-enum/[1]
以上就是本文的全部内容,如果对你有所帮助,欢迎点赞、收藏、转发~
参考资料[1]
https://dmitripavlutin.com/javascript-enum/:https://dmitripavlutin.com/javascript-enum/




推荐阅读