【发布时间】:2013-09-26 18:04:10
【问题描述】:
因此,我受到这个问题 (Enums in 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。 (我目前无法访问旧版浏览器来测试可能的重新定义) - 我可能遗漏了 Enum 定义的任何注意事项。
jsFiddle:
注意:我有odp=Object.defineProperty 和args=arguments 的原因是我在将JavaScript 插入到我的页面之前通过闭包编译器运行它,这样做有助于压缩。 (对于那些可能想知道的人)
【问题讨论】:
-
这些“类型安全”如何?
-
Object.defineProperty 默认为不可写值。
-
@Duncan "Object.defineProperty 默认为不可写值" 好的,这与类型安全无关。它与不让枚举改变有关,是的,但是......
-
检查 jsFiddle...它们不能被重写
-
啊,是的……那里的术语有点混乱……已编辑。
标签: javascript enums unmodifiable