JavaScript创建枚举

 相比直接写数字与字符串值,用枚举表示预定义范围的常量值有很多优点,这里就不做赘述了,但目前为止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.mzph.cn/news/177391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightdb substr函数支持浮点类型

背景 在信创适配中,从ORACLE迁移过来的程序使用了substr函数。 LightDB 23.4版本对该函数进行了增强。支持位置参数和长度参数使用number类型。 示例 使用substr(text, numeric, numeric)函数 declareline varchar(300) : 312456789009876543001000.00;acct va…

mac解压gz文件

我发现一个问题,比如我从GSE144136里下载的文件 这个结果是这样的,直接双击是没有用的 因此需要使用命令行 gzip -d GSE144136_GeneNames.csv.gz

猜数字游戏

需求目标 这个游戏窗口要求玩家猜一个1到100之间的数字。玩家可以在文本框中输入自己的猜测,并点击提交按钮进行验证。游戏会给出相应的提示,直到玩家猜中正确的数字为止。 效果 源码 /*** author lwh* date 2023/11/28* description 猜数字游戏**/ i…

基于springboot房地产项目设计流程管理系统

一、需求描述 该项目针对某房地产效果图公司的项目流程进行信息化管理。其目标是使得该公司的管理人员、普通员工、前台、能够对项目、员工(包括主管)、财务、工作业绩以及客户进行全方位的管理,并在此基础上能够挖掘员工潜力,能够…

C语言——输入 10 个数,分别统计其中正数、负数、零的个数

#include <stdio.h> int main() {int numbers[10]; // 存储输入的10个数int positive_count 0; // 正数计数器int negative_count 0; // 负数计数器int zero_count 0; // 零计数器// 输入10个数printf("请输入10个数&#xff1a;\n");for (int i 0; i …

AMP State Evolution的计算:以伯努利-高斯先验为例

AMP State Evolution (SE)的计算 t 1 t1 t1时&#xff0c; E ( t ) E [ X 2 ] \mathcal E^{(t)} \mathbb E [X^2] E(t)E[X2]&#xff0c;SE的迭代式为 τ r ( t ) σ 2 1 δ E ( t ) E ( t 1 ) E ∣ η ( t ) ( X Z ) − X ∣ 2 , Z ∼ N ( 0 , τ r ( t ) ) \begin{a…

HarmonyOS应用开发者基础认证考试(90分过)

此博文为HarmonyOS应用开发者基础认证考试的最后的大考&#xff0c;要求100分取得90分方可获取证书、现将考试的题库进行分享&#xff0c;希望能帮到大家。但是需要注意的是&#xff0c;题库会不定时的进行题目删减&#xff0c;但是大概的内容是不会进行改变的。真心希望这篇博…

历时三个月,我发布了一款领取外卖红包小程序

近几年&#xff0c;推广外卖红包爆火&#xff0c;各种推广外卖红包的公众号层出不穷。于是&#xff0c;我就在想外卖红包究竟是怎么一回事。就这样&#xff0c;我带着问题开始了关于外卖红包的研究。 在研究的过程中&#xff0c;我开始了解隐藏优惠券、cps等一系列相关的术语。…

9个AI视频后期处理神器——Runway 全功能超详细使用教程(3)

前面2期内容&#xff0c;主要给大家重点介绍了Runway视频生成技术的核心产品功能板块Gen1、Gen2、FI使用教程&#xff0c;还没有看过的小伙伴可以回看往期文章。除了视频生成AI技术外&#xff0c;Runway还具有图片、视频后期处理30多项单个功能&#xff0c;例如视频修复、视频主…

用Elasticsearch搜索匹配功能实现基于地理位置的查询

1.Redis,MongoDB,Elasticsearch实现地理位置查询比较 1.1 Redis: 优点&#xff1a;Redis提供了地理空间索引功能&#xff0c;可以通过Geo数据类型进行地理位置查询。这使得Redis在处理地理位置查询时非常高效。 缺点&#xff1a; Redis的地理空间索引功能相对简单&#xff0…

融云筑基,移动云加速构建高性能智能算力底座

自2022年11月以来&#xff0c;全球大模型数量迅速增加&#xff0c;以ChatGPT为代表的大模型已经成为世界数字科技领域新热点。大模型带来的算力需求迅速增长&#xff0c;未来智算场景将会有非常大的突破空间。 在“十四五”规划的指引下&#xff0c;各地政府积极投入智算中心建…

深度学习-yolo目标检测-机器学习-计算机视觉-python学习路线(呕心沥血出品-绝对精品-附资源链接)

学习路线 1. 计算机视觉基础知识 图像处理基础:了解图像的基本处理技术,如滤波、边缘检测、直方图等。数字图像处理:熟悉数字图像的表示、颜色模型、图像增强等基本概念。opencv课程链接:Python for Computer Vision with OpenCV and Deep Learning资料推荐: 书籍:《数字…

内核延时函数sleep和delay

延时函数 linux 驱动开发过程中&#xff0c;经常会用到延迟函数&#xff1a;udelay&#xff0c;mdelay&#xff0c;usleep&#xff0c;msleep&#xff0c;usleep_range。这几个延时函数优先使用usleep_range其次是usleep最后udelay。 1、delay和sleep的区别 delay&#xff0…

基于vue框架的美团类药品点单系统

基于VUE框架的美团类药品点单管理系统 摘要&#xff1a; 2019年12月以来&#xff0c;中国湖北省武汉市爆发新型冠状病毒引发的肺炎疫情&#xff0c;并通过人传人的感染方式快速向全国其他地区扩散。全国上下万众一心抗击病毒&#xff0c;湖北广东浙江等24省市启动重大卫生突发…

运动耳机哪个好?跑步耳机哪个好?蓝牙运动耳机十大名牌排行榜

​相信很多人都喜欢在运动的过程中佩戴着耳机一边锻炼一边听音乐享受过程。在选择运动耳机的时候一定要重点去关注以下几点&#xff0c;佩戴时要绝对稳固舒适、音质表现不差、防水防尘效果要好等&#xff0c;这样就不会容易损伤耳朵。很多朋友还不知道运动耳机该怎么选&#xf…

【数据结构】带修莫队

文章目录 问题引入 核心维护修改 总结Code 问题引入 洛谷P1903 嗯&#xff0c;上手一个莫队 … \dots … &#xff1f;还有修改操作&#xff1f; 本文我们来学习带修莫队&#xff0c;及支持修改的莫队。 请确保你已经学会了普通的莫队&#xff0c;不会的可以看这里。 和原来的…

idea创建spring boot项目,java版本只能选择17和21

1.问题描述 java版本为"11.0.20"&#xff0c;idea2023创建spring boot项目时&#xff08;File->Project->Spring Initializr&#xff09;&#xff0c;java版本无法选择11&#xff0c;导致报错&#xff0c;如下图所示&#xff1a; 2.原因 spring2.X版本在2023…

力扣labuladong——一刷day55

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣951. 翻转等价二叉树二、力扣124. 二叉树中的最大路径和三、力扣112. 路径总和&#xff08;遍历&#xff09;四、力扣112. 路径总和&#xff08;分解&a…

GEE errors——在大图像转化为矢量集合中如何避免超限?(含解决方案和详细代码)

问题: 假设在 Google Earth Engine 中有一个大图像,我想将其导出为 CSV。但是,由于它的大小,我很难将其转换为 FeatureCollection 来进行导出,而且我不知道是否有解决方法。 这里将提供几条修改意见,一个是根据经纬度获取个点的值,并用sample进行提取;另外就是重采样…

无效的目标发行版: 21 和springboot爆错

目录 问题描述 原因分析&#xff1a; 问题描述 springboot爆红 调整一下这个&#xff1a;把这里的version调低一点应该就可以了 无效的目标发行版: 21 调整一下这个把这里的Java version调整一下&#xff0c;我是调整到1.8&#xff08;其他没有试过&#xff09; 原因分析&a…