因此,我受到这个问题(JavaScript 中的枚举?)的启发,开始着手为 JavaScript 插入库以启用不可修改的枚举。我已经定义了一个体面的工作方法,但我想进一步充实它。
这个概念利用Object.defineProperty
(文档:Here)
我目前的定义允许:
var obj1 = {}, obj2 = {}, obj3 = {};
// Straight declaration (normal)
obj1.Enum('RED','BLUE','GREEN');
obj1.RED // == 0
obj1.BLUE // == 1
obj1.GREEN // == 2
// Buffer (padding) usage
obj2.Enum('RED','BLUE',null,undefined,'','GREEN');
obj2.RED // == 0
obj2.BLUE // == 1
obj2.GREEN // == 5
// Direct offset and case-correction
obj3.Enum('RED','BLUE',10,'gReEn','burnt orange');
obj3.RED // == 0
obj3.BLUE // == 1
obj3.GREEN // == 11
obj3.BURNT_ORANGE // == 12
到目前为止我所拥有的:
var odp=Object.defineProperty;
odp(Object.prototype,'Enum', {
value: function() {
var ignore=[undefined,null,''], n=0, args=arguments;
for(var i in args) {
if(ignore.indexOf(args[i])<0) {
if( typeof args[i]=="number") {
n=parseInt(args[i]);
} else {
try {
odp(this,String(args[i]).toUpperCase().replace(" ","_"), {
value:parseInt(n),enumerable:true
});
} catch(e) {
console.warn(e.message);
n--;
}
}
}
n++;
}
return this;
}
});
我想补充的两件事是:
- 较旧的浏览器支持:因此,重新
Object.defineProperty
定义未定义的位置。(我目前无法访问旧版浏览器来测试可能的重新定义) - 我可能错过了枚举定义的任何考虑。
jsFiddle:
- 版本 4:http: //jsfiddle.net/rqYgt/4/
- 版本 5:http: //jsfiddle.net/rqYgt/5/
注意:我拥有odp=Object.defineProperty
并且args=arguments
是我在将 JavaScript 插入我的页面之前通过闭包编译器运行它的原因,这样做有助于压缩。(对于那些可能想知道的人)