如何在javascript中创建枚举

如何在javascript中创建枚举,javascript,Javascript,我需要创建命名常量 例如: NAME_FIELD: { CAR : "car", COLOR: "color"} 使用: var temp = NAME_FIELD.CAR // valid var temp2 = NAME_FIELD.CAR2 // throw exception 最重要的是,如果密钥无效,我需要创建这个由枚举引起的错误现在普通javascript对象中的自定义setter和getter已被弃用,解决方案可能是为对象定义一

我需要创建命名常量

例如:

NAME_FIELD: {
            CAR : "car", 
            COLOR: "color"}
使用:

var temp = NAME_FIELD.CAR // valid
var temp2 = NAME_FIELD.CAR2 // throw exception

最重要的是,如果密钥无效,我需要创建这个由枚举引起的错误

现在普通javascript对象中的自定义setter和getter已被弃用,解决方案可能是为对象定义一个类和一个
set
函数:

NAME_FIELD= {
     CAR : "CAR", 
     COLOR: "COLOR"
};

function MyClass(){
}
MyClass.prototype.setProp = function (val) {
  if (!(val in NAME_FIELD)) throw {noGood:val};
  this.prop = val;
}
var obj = new MyClass();

obj.setProp(NAME_FIELD.CAR); // no exception
obj.setProp('bip'); // throws an exception
但由于枚举不是本机构造,我不确定是否会使用这样的东西。这听起来太像“试图在javascript中强制使用java功能”。你可能不需要这个

最重要的是,如果密钥无效,我需要使这个枚举导致错误

不幸的是,你不能。执行伪枚举的方式是通常的方式,即在对象上创建属性,但是如果试图从不存在的对象检索属性,则无法让JavaScript引擎抛出错误。相反,引擎将返回
未定义的

您可以通过使用函数来实现这一点,这显然存在实用性问题

或者(我真的不喜欢这个想法),你可以这样做:

var NAME_FIELD$CAR = "car";
var NAME_FIELD$COLOR = "color";
由于您可以将其作为自由标识符访问,因此尝试读取不存在的值:

var temp2 = NAME_FIELD$CAR2;

…失败,出现
ReferenceError
。(即使在非严格模式代码中也是如此;仅适用于写入自由标识符,而不是读取自由标识符。)

JavaScripts中没有枚举请参阅:我认为这是重复的为什么setter,为什么不getter?我的意思是,如果OP获得无效属性,他希望抛出异常。