const Name = 'Name ';
const Name_USER_PASSWORD = 'Name ';
const Name= 'Name ';
const USER_FULL_NAME = 'FullName';
我的项目中有50个这样的常量,但我认为有更好的方法可以通过javascript中的某些技术来适应它。就像将它们放入原型或其他东西一样。
答案 0 :(得分:0)
我不使用const
关键字来声明公共常量,因为全局命名空间会被污染。
我推荐的定义常量的方法是使用Object.defineProperty
方法,并回退属性赋值方法。另外,我对常量使用特殊值:对象文字({}
)。这个值的目的在本答案的最后解释。
// ... created a class, object, or somethin, say MyNS
// You could write a method to implement the following constant-definition method
if (Object.defineProperty) { // Yay, ES5!
Object.defineProperty(MyNS, 'CONST', {
value: {},
enumerable: true, // Default false. Are the props visible, eg in a for-loop?
writable: false, // Default false, constants should be CONSTANT
configurable: false// Default false, prevent deletion of the constant, etc.
});
} else { // If ES is not supported:
MyNS.CONST = {};
}
检查常数:
if (setting === MyNS.CONSTANT) // .... Rest of logic
使用此方法,用户无法对常量值进行硬编码(这可能导致意外的,难以调试的错误)。
比较将始终返回false ,除非该变量确实指向MyNS.CONSTANT1
。
另一个应用程序是具有动态数量的参数的函数。比如说,您想创建一种具有可配置选项的console.log
函数。使用字符串/数字/ ...常量值将导致可能的错误
例如:
var log.CONST = 1;
function log() {
for (var i=0; i<arguments.length; i++) {
if (arguments[i] === log.CONST) ...some logic...
}
}
log(1); // 1 is the value of log.CONST, the function will FAIL.
// Fix: If you were using log.CONST = {}, the assertion will only be true
// when the argument === log.CONST
答案 1 :(得分:0)
如果您正在寻找一种组织常量的方法,您可以将它们作为一个或多个对象的属性,例如:
var myConstants = {
NAME : "name",
NAME_USER_PASSWORD : "password here",
USER_FULL_NAME : "Joe Jones",
ETC : "Other constant"
};
console.log( myConstants.USER_FULL_NAME ); // "Joe Jones"
或者是一个更复杂的分组示例:
var myConstants = {
DB : {
CONNECTION_STRING : "something",
USER : "name",
PASSWORD : "password here"
},
COLOR : {
BLACK : "#000000",
RED : "#FF0000",
WHITE : "#FFFFFF"
}
};
console.log( myConstants.DB.PASSWORD ); // "password here"
当然myConstants
是一个非常蹩脚的名字,但你明白了......