我需要创建命名常量。
例如:
NAME_FIELD: {
CAR : "car",
COLOR: "color"}
使用:
var temp = NAME_FIELD.CAR // valid
var temp2 = NAME_FIELD.CAR2 // throw exception
最重要的是,如果密钥无效,我需要使这个枚举导致错误
我需要创建命名常量。
例如:
NAME_FIELD: {
CAR : "car",
COLOR: "color"}
使用:
var temp = NAME_FIELD.CAR // valid
var temp2 = NAME_FIELD.CAR2 // throw exception
最重要的是,如果密钥无效,我需要使这个枚举导致错误
最重要的是,如果密钥无效,我需要使这个枚举导致错误
不幸的是,你不能。您执行伪枚举的方式是通常的方式,即在对象上创建属性,但如果您尝试从不存在的对象中检索属性,则无法让 JavaScript 引擎引发错误存在。相反,引擎将返回undefined
.
您可以通过使用函数来做到这一点,这显然存在实用程序问题。
或者(我真的不喜欢这个想法),你可以这样做:
var NAME_FIELD$CAR = "car";
var NAME_FIELD$COLOR = "color";
由于您将这些作为免费标识符访问,因此尝试读取一个不存在的值:
var temp2 = NAME_FIELD$CAR2;
...以 . 失败ReferenceError
。(即使在非严格模式代码中也是如此;隐式全局的恐怖只适用于写入一个自由标识符,而不是从一个标识符中读取。)
现在不推荐使用普通 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 功能”。你可能不需要这个。