在JavaScript中仿真Java的enum

背景

最近开始做的一个项目使用facebook的ReactJS前端框架。发现经常使用react的keyMirror工具来定义一些枚举常量:

var keyMirror = require('keyMirror');
var AppMode = keyMirror({
    LOG_IN: null,
    SIGN_UP: null
});
module.exports = AppMode;

其他JS代码对该枚举的引用大概如下代码:

var AppMode = require('../const/app_mode');

if (curMode == AppMode.LOG_IN) {
    ...
} else {
    ...
}
...

var className = (curMode == AppMode.LOG_IN) ? 'login-form' : 'signup-form';
...

这样的代码感觉还行,起码比字串漫天飞舞的情况好很多。不过我发现诸如curMode == AppMode.LOG_IN类型的代码太多了,写起来不太舒服,而且总是要求我require('../const/app_mode'),我希望能简单地写类似于curMode.isLogIn()的代码。所以就搞了这个简单的工具gen_enum:

用法

npm install gen_enum

var createEnum = require('gen_enum');
var COLORS = createEnum("blue red");
var myColor = COLORS.blue;
console.log(myColor._id); // output blue
console.log(myColor.isBlue()); //output true
console.log(myColor.isRed()); //output false
console.log(myColor.name()); //output blue
console.log(myColor.toString()); //output blue

输入: "key1 key2 ..."

注意,除空白以外关键字还可以用,, ; 以及:来分割

输出:

{
    key1: {
        _id: 'key1',
        name: function() {
            return 'key1';
        },
        toString: function() {
            return 'key1';
        },
        isKey1: function() {
            return true;
        },
        isKey2: function() {
            return false;
        }
    },
    key2: {
        _id: 'key2',
        name: function() {
            return 'key2';
        },
        toString: function() {
            return 'key2';
        },
        isKey1: function() {
            return false;
        },
        isKey2: function() {
            return true;
        }
    }
}

其他输入形式

使用字串来指定枚举关键字只是一种方式,gen_enum还支持其他两种形式的输入:

// 用字串数组来指定枚举关键字
var Color = genEnum("blue", "red");
var myColor = Color.blue;

// 用Object对象来指定枚举关键字
var WeekDay = genEnum({
    Monday: null,
    Tuesday: null
})
var myDay = WeekDay.Monday;

关于 CamelCase

gen_enum将大写加下划线的枚举关键字的isXXX函数名转换为CamelCase形式:

var AppMode = genEnum('SIGN_UP, LOG_IN, FORGOT_PASSWORD');
var curMode = AppMode.LOG_IN;
console.log(curMode.isLogIn()); // 输出 true
console.log(curMode.isSignUp()); // 输出 false
console.log(curMode.isForgotPassword()); // 输出 false

关于只读(Immutability)

gen_enum使用Object.freeze来锁定返回的枚举结构。如果环境(IE8或更早的版本)不支持Object.freeze,则返回的枚举结构不具备只读特性。

项目地址:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日常分享

Java 循环队列的实现

  队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空...

1603
来自专栏海纳周报

详解Python的is操作符

is 操作符是Python语言的一个内建的操作符。它的作用在于比较两个变量是否指向了同一个对象。 与 == 的区别 class A(): def __i...

4249
来自专栏开发与安全

数据结构:队列的顺序存储结构(循环队列)

队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO)。允许插入的一端称为队尾,允许删除的一端称为队头...

2177
来自专栏大内老A

采用一个自创的"验证框架"实现对数据实体的验证[扩展篇]

关于“验证框架”,先后推出了《编程篇》、《设计篇》和《改进篇》,本不打算再写《XXX篇》的。但是今天收到两个园友的短消息,想了解一下如何定义自己的验证规则。这实...

2177
来自专栏Java大联盟

23种设计模式详解(五)

1283
来自专栏技术点滴

原型模式(Prototype)

原型模式(Prototype) 原型模式(Prototype) 意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。 应用:Java/C#中的...

1795
来自专栏進无尽的文章

编码篇-低耦合代码注入

我下面要将的内容也许网上已经有很多相关的介绍了,但是我还是会写出这篇文章,一来是对自己学习的总结,虽然总结的有些晚,如果你仔细看,会发现我的文章有别处没有的内容...

1002
来自专栏difcareer的技术笔记

JNI实现源码分析【四 函数调用】正文0x01:dvmCallMethodV0x02:nativeFunc0x03: 何时赋值

有了前面的铺垫,终于可以说说虚拟机是如何调用JNI方法的了。JNI方法,对应Java中的native方法,所以我们跟踪对Native方法的处理即可。

894
来自专栏云霄雨霁

Java--通配符类型

1744
来自专栏C语言及其他语言

【每日一题】问题 1209: 密码截获

题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或...

2657

扫码关注云+社区