Javascript:常量属性

时间:2009-05-25 12:57:40

标签: javascript object constants

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

以下是一个示例对象:

   var XU = {
      Cc: Components.classes
   };

   function aXU()
   {
      this.Cc = Components.classes;
   }

   var XU = new aXU();

只是将“const”放在它前面,不起作用。

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

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

非常感谢你!

干杯。

4 个答案:

答案 0 :(得分:12)

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

在对象文字中,有一个特殊的语法:

var XU = {
    get Cc() { return Components.classes; }
};

在第二个示例中,您可以使用__defineGetter__方法将其添加到构造函数中的aXU.prototypethis。哪种方式更好取决于对象的每个实例的值是否不同。

编辑:为了帮助解决可读性问题,您可以编写类似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);
}

有关详情,请参阅Mozilla Developer Center documentation

答案 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