最近开始做的一个项目使用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;
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
项目地址:
原文:http://my.oschina.net/greenlaw110/blog/405772