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

相关文章

来自专栏ASP.NETCore

ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninjec...

674
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2070
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2587
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2802
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4045
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5556
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4868
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5337
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2192
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25410

扫码关注云+社区