在javascript中,我可以声明对象的属性是常量吗?
以下是一个示例对象:
var XU = {
Cc: Components.classes
};
或
function aXU()
{
this.Cc = Components.classes;
}
var XU = new aXU();
只是将“const”放在它前面,不起作用。
我知道,我可以声明一个具有相同名称的函数(这也是一种常量),但我正在寻找一种更简单,更易读的方法。
浏览器兼容性并不重要。它只需要在Mozilla平台上工作,就像Xulrunner项目一样。
非常感谢你!
干杯。
答案 0 :(得分:12)
由于您只需要在Mozilla平台上工作,因此您可以定义一个没有相应setter的getter。对于每个示例,最好的方法是不同的。
var XU = {
get Cc() { return Components.classes; }
};
在第二个示例中,您可以使用__defineGetter__
方法将其添加到构造函数中的aXU.prototype
或this
。哪种方式更好取决于对象的每个实例的值是否不同。
编辑:为了帮助解决可读性问题,您可以编写类似defineConstant
的函数来隐藏丑陋。
function defineConstant(obj, name, value) {
obj.__defineGetter__(name, function() { return value; });
}
此外,如果您想在尝试分配错误时抛出错误,则可以定义一个只抛出Error对象的setter:
function defineConstant(obj, name, value) {
obj.__defineGetter__(name, function() { return value; });
obj.__defineSetter__(name, function() {
throw new Error(name + " is a constant");
});
}
function aXU() {
}
defineConstant(aXU.prototype, "Cc", Components.classes);
function aXU() {
// Cc_value could be different for each instance
var Cc_value = return Components.classes;
defineConstant(this, "Cc", Cc_value);
}
答案 1 :(得分:5)
更新:这有效!
const FIXED_VALUE = 37;
FIXED_VALUE = 43;
alert(FIXED_VALUE);//alerts "37"
从技术上讲,我认为答案是肯定的(直到const进入狂野状态)。你可以提供包装等等,但是当它归结为它时,你可以随时重新定义/重置变量值。
我认为你最接近的是在“阶级”上定义一个“常数”。
// Create the class
function TheClass(){
}
// Create the class constant
TheClass.THE_CONSTANT = 42;
// Create a function for TheClass to alert the constant
TheClass.prototype.alertConstant = function(){
// You can’t access it using this.THE_CONSTANT;
alert(TheClass.THE_CONSTANT);
}
// Alert the class constant from outside
alert(TheClass.THE_CONSTANT);
// Alert the class constant from inside
var theObject = new TheClass();
theObject.alertConstant();
但是,“class” TheClass 本身可以在以后重新定义
答案 2 :(得分:2)
如果您使用的是Javascript 1.5(例如在XUL中),则可以使用const
关键字代替var
来声明常量。
问题在于它不能是对象的属性。您可以尝试通过在函数内部命名它来限制其范围。
(function(){
const XUL_CC = Components.classes;
// Use the constant here
})()
答案 3 :(得分:0)
要定义常量属性,可以在defineProperty方法中将writable属性设置为false,如下所示:
代码段:
var XU = {};
Object.defineProperty(XU, 'Cc', {
value: 5,
writable: false
});
XU.Cc = 345;
console.log(XU.Cc);
<强>结果:强>
5 # The value hasn't changed