在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 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫实战

Google Python风格规范(上)

好的代码风格,给人舒服的感觉,今天介绍一下谷歌的Python风格规范,由于规范比较多,将分为两次介绍。

652
来自专栏非著名程序员

Java 反射基础(下)

? 投稿作者:芮成兵/csdn 原文链接: http://blog.csdn.net/My_TrueLove/article/details/51306921...

2046
来自专栏SDNLAB

【一课专栏】解构2 - 明察YangInstanceIdentifier

屈原《离骚》中云:“路漫漫其修远兮,吾将上下而求索”,其实,学习软件编程,学习SDN技术也是一个路漫漫,上下求索的过程。

892
来自专栏听雨堂

Execute 方法(Find 对象)

Execute 方法(Find 对象) 运行指定的查找操作。如果查找成功,则返回 True。 语法 expression.Execute(FindText, M...

1777
来自专栏王磊的博客

有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!

一、单引号和双引号转义在PHP的数据存储过程中用得比较多,即往数据库里面存储数据时候需要注意转义单、双引号; 先说几个PHP函数: 1、addslashes —...

2957
来自专栏王肖的UT

GLSL-语法基础

1606
来自专栏Golang语言社区

golang 如何验证struct字段的数据格式

假设我们有如下结构体: type User struct { Id int Name string Bio str...

4155
来自专栏SHERlocked93的前端小站

JS 适配器模式

适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那...

802
来自专栏喵了个咪的博客空间

zephir-(4)基本语法

#zephir-基本语法# ? ##前言## 先在这里感谢各位zephir开源技术提供者 每个语言都有它的语法,每个语言都有他的结构,那么今天就来和小编来讨论z...

2676
来自专栏技巅

Thrift之代码生成器Compiler原理及源码详细解析1

1285

扫码关注云+社区