JavaScript创建枚举

news/2024/5/19 0:29:31 标签: enum, 枚举, js enum

 相比直接写数字与字符串值,用枚举表示预定义范围的常量值有很多优点,这里就不做赘述了,但目前为止javascript并没有提供原生的enum类型(typescript当然就支持),通常javascript会借助对象类型来等效实现enum类型,实现方式有多种,这里介绍基于代理的枚举实现方式:

(其它实现方式及优缺点详见: https://zhuanlan.zhihu.com/p/629573201在JavaScript中4种创建枚举方式)

基于代理的枚举

代理枚举是一种有趣的实现方式。一个代理对象是一个特殊的对象,它包装另一个对象并修改对原始对象的操作的行为。代理不会改变原始对象的结构。

枚举代理拦截枚举对象的读取和写入操作,并且:

  • 当访问不存在的枚举值时抛出错误
  • 当更改枚举对象属性时抛出错误

代理的get()方法拦截读操作,并在属性名称不存在时抛出错误。set()方法拦截写操作并抛出错误。它旨在保护枚举对象免受写操作的影响。

//enum.js:

//说明:早期的浏览器或某些IE版本可能不支持Proxy(虽然IE已退出舞台,但考虑一些还需要IE的旧项目场景), 这里尽量做下兼容实现:

(function (global) {
    if (!!Proxy) {
        global.Enum = function(baseEnum) {
            return new Proxy(baseEnum, {
                get(target, name) {
                    if (!baseEnum.hasOwnProperty(name) && !name.toString() === 'Symbol(Symbol.toStringTag)') {
                        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')
                }
            })
        };        
    } else {
        global.Enum = function(baseEnum) {
            //return baseEnum;

            var newEnum = Object.assign({}, baseEnum);            
            Object.defineProperties(newEnum
                , Object.assign({}
                    , ...Object.keys(newEnum).map(function (key) {
                        return {
                            [key]: {
                                get: function () {
                                    //if (!newEnum.hasOwnProperty(key) && !key.toString() === 'Symbol(Symbol.toStringTag)') {
                                    //    throw new Error(`"${key}" value does not exist in the enum`)
                                    //}
                                    return baseEnum[key]    //注意这里不可newEnum[key]否则会死循环
                                },
                                set: function(value) {
                                    throw new Error('Cannot update the value of the enum')
                                }
                            }
                        }
                    })
                )
            );
            
            //防止新属性被添加到对象中(即防止该对象被扩展),只有当"use strict"时才会报错“Error: Cannot add property XXX, object is not extensible”, 否则只是添加新属性无效但不会报错:
            Object.preventExtensions(newEnum);

            return newEnum;
        };
    }
})(window)

 使用方式:

import { Enum } from './enum'
const Sizes = Enum({
  Small: 'small',
  Medium: 'medium',
  Large: 'large',
})
const mySize = Sizes.Medium
console.log(mySize === Sizes.Medium) // logs true

代理枚举的使用方式和普通对象枚举完全相同

代理枚举的缺点

代理枚举的缺点是始终需要导入 Enum 工厂函数并将枚举对象包装在其中。与使用其他实现方式相比,代理枚举可能会带来一些性能损失。代理枚举涉及使用 JavaScript 的代理特性,这可能会使枚举对象的访问速度稍慢一丢丢。

参考资料:

在JavaScript中4种创建枚举方式 - 知乎


http://www.niftyadmin.cn/n/5222037.html

相关文章

MES系统的功能清单

MES系统的功能清单 一、生产计划管理 1. 订单和生产计划制定:根据客户需求和市场状况,制定生产计划和订单,确保生产资源的合理分配和生产进度的有效管理。 2. 生产排程:根据生产计划和订单,结合设备、人员、物料等资…

解决idea重复配置maven的问题

终于解决了一直以来的疑难问题。 因为项目中一般不让配置maven地址,使用的是idea配置的。每次新建项目都需要配置maven,很麻烦。 以下解决策略: 2022.3的版本可以试试这个配置 其他版本可以试试这个方法: 进入到idea的启动界面&…

U-Net代码复现--更新中

本文记录自己的学习过程,内容包括: 代码解读:Pytorch-UNet 深度学习编程基础:Pytorch-深度学习(新手友好) UNet论文解读:医学图像分割:U_Net 论文阅读 数据:https://hack…

获得文件MD5——校验完整性 window 和 Linux下操作

目录 引出window下获得文件MD5Linux下获得文件MD5单个文件整个目录下所有文件检查MD5 总结 引出 1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值; 2.Linux下md5sum命令获得文件MD5值; window下获得文件MD5 Windows 10 自带了一个命…

Linux之高级IO

目录 IO基本概念五种IO模型钓鱼人例子五种IO模型高级IO重要概念同步通信 VS 异步通信阻塞 VS 非阻塞其他高级IO阻塞IO非阻塞IO IO基本概念 I/O(input/output)也就是输入和输出,在著名的冯诺依曼体系结构当中,将数据从输入设备拷贝…

英语学习(电影篇)

一、谈论你最近看过的电影 1.电影类型 1)science fiction 科幻片 2)comedy 搞笑片 3)horror 惊恐 4)action 精彩的情节 5)western 西部片 6)thriller 惊恐片 7&…

ubuntu下如何查看.gz压缩包中的内容,以及grep过滤查找文件中的某些内容

1、查看压缩包file.gz中的全部内容 $ zcat file.gz 2、对一个.gz的压缩包解压缩 $ gunzip file.gz 3、过滤查找文件中的某些内容 $ grep "Hello" file.txt 注:我通常先解压,然后再grep 4、过滤查找文件中的内容,并显示其上下3行…

扩散模型DDPM学习笔记

扩散模型DDPM 文章目录 扩散模型DDPM如何运作基本概念训练过程推理过程: 目标损失函数推导评估标准 论文地址: Denoising Diffusion Probabilistic Models (DDPM) 如何运作 ​ 从guassian distribution进行采样得到一个噪声的图片,图片大小…