Javascript:常量属性

Javascript:常量属性,javascript,object,constants,Javascript,Object,Constants,在javascript中,我可以将对象的属性声明为常量吗 下面是一个示例对象: var XU = { Cc: Components.classes }; 或 只是把“const”放在前面是不起作用的 我知道,我可以用相同的名称声明一个函数(这也是一种常量),但我正在寻找一种更简单、更可读的方法 浏览器兼容性并不重要。它只需要在Mozilla平台上工作,就像在Xulrunner项目中一样 多谢各位 干杯。更新:这很有效 const FIXED_VALUE = 37; FI

在javascript中,我可以将对象的属性声明为常量吗

下面是一个示例对象:

   var XU = {
      Cc: Components.classes
   };

只是把“const”放在前面是不起作用的

我知道,我可以用相同的名称声明一个函数(这也是一种常量),但我正在寻找一种更简单、更可读的方法

浏览器兼容性并不重要。它只需要在Mozilla平台上工作,就像在Xulrunner项目中一样

多谢各位


干杯。

更新:这很有效

const FIXED_VALUE = 37;
FIXED_VALUE = 43;
alert(FIXED_VALUE);//alerts "37"
从技术上讲,我认为答案是否定的(直到它进入野外)。您可以提供包装器等,但归根结底,您可以随时重新定义/重置变量值

我认为最接近的方法是在“类”上定义一个“常量”


但是,如果您使用Javascript 1.5(例如在XUL中),则可以使用
const
关键字而不是
var
来声明常量,随后可以重新定义类本身

问题是它不能是对象的属性。您可以尝试通过在函数中对其命名来限制其作用域

(function(){ 

const XUL_CC = Components.classes;

// Use the constant here

})()

因为您只需要它在Mozilla平台上工作,所以可以定义一个getter,而不需要相应的setter。对于您的每个示例,最好的方法是不同的

在对象文字中,有一种特殊的语法: 在第二个示例中,可以使用
\uu defineGetter\uu
方法将其添加到构造函数中的
aXU.prototype
this
。哪种方法更好取决于对象的每个实例的值是否不同

Edit:为了帮助解决可读性问题,您可以编写一个类似
defineConstant
的函数来隐藏丑陋之处

function defineConstant(obj, name, value) {
    obj.__defineGetter__(name, function() { return value; });
}
此外,如果要在尝试分配时抛出错误,可以定义一个仅抛出错误对象的setter:

function defineConstant(obj, name, value) {
    obj.__defineGetter__(name, function() { return value; });
    obj.__defineSetter__(name, function() {
        throw new Error(name + " is a constant");
    });
}
如果所有实例都具有相同的值: 或者,如果值取决于对象:
有关详细信息,请阅读。

要定义常量属性,可以在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
结果:

var XU = {};

Object.defineProperty(XU, 'Cc', {
    value: 5,
    writable: false
});

XU.Cc = 345;

console.log(XU.Cc);
5           # The value hasn't changed

这实际上是我最后做的,尽管它缺乏可读性。我还定义了一个不做任何事情的setter。我是从另一个线程得到的,但是从你的例子来看,setter似乎没有必要。所以我把它拿走了。谢谢大家!关于可读性的观点很好。你可以写一个defineConstant函数或类似的东西来帮助我。这正是我想要的。谢谢。我正在使用一个全局变量
GVars
,该变量声明为全局常量。然后,我使用您的函数添加getter和setter作为这个
GVars
的一个字段。我之所以需要这样做,是因为我想创建一个全局常量,它在jQuery函数之后赋值。这是一个非常好的解决方案。非常感谢你。(如果可以的话,我会给你不止一票。)
function aXU() {
    // Cc_value could be different for each instance
    var Cc_value = return Components.classes;

    defineConstant(this, "Cc", Cc_value);
}
var XU = {};

Object.defineProperty(XU, 'Cc', {
    value: 5,
    writable: false
});

XU.Cc = 345;

console.log(XU.Cc);
5           # The value hasn't changed