面向对象的javascript如何为常量创建静态类

时间:2011-11-11 16:59:12

标签: javascript

我已决定将所有常量放在一个名为常量的简洁类中,并希望使用点运算符访问其成员。

到目前为止,我已经尝试过:

function Constants(){
    Constants.style = {};
    Constants.style.border_sides = 20;
    Constants.style.button_width = 17;
    // ...
}

以后

Constants = new Constants();

{
    $('#button').width(Constants.style.button_width);
}

这导致了

  

无法访问未定义的button_width。

我会使用JSON声明常量,但我喜欢我的代码中的注释。 有人会解释javascript的OO吗?

4 个答案:

答案 0 :(得分:5)

如果你想要一个包含静态和实例方法的“类”:

function ClassName(){

}

ClassName.prototype = { //Put instance methods here
   instanceMethod1 : function(){},

   instanceMethod2 : function(){}
};

ClassName.staticMethod1 = function(){};
ClassName.staticMethod2 = function(){};

var a = new ClassName();

a.staticMethod1; //undefined
a.instanceMethod1; //function(){};

ClassName.staticMethod1 //function(){};

答案 1 :(得分:5)

您将Constants函数替换为Constants的实例。并且您将常量应用于函数,而不是常量或原型的实例。所以你有效地擦掉了你的常数。

我认为只使用对象文字

var constants = {
   style: {
        border_sides: 20
   }
};

请记住,这两种方法都没有任何实际意义。任何人都可以轻松更改“常量”值。如果您想要真正的常量数据,可能需要使用getter / setter,Object.defineProperty或模块模式。

答案 2 :(得分:4)

为什么不考虑使用文字?

var Constants = {
    style: {
        border_sides: 20,
        button_width: 17
    }
}

即使您愿意考虑使用construction function,也请将Constants替换为this

function Constants(){
    this.style = {};
    this.style.border_sides = 20;
    this.style.button_width = 17;
    // ...
}

您不需要为文字做任何new Constants()(第一个示例)。马上开始使用。

对于第二个示例(constructor function),您需要执行var constants = new Constants()

答案 3 :(得分:2)

在Javascript中,everyting是一个对象,所以你要在函数中的Constants函数中添加属性。

要获得想要写的效果:

var Constants = {
  someText: 'text1',
  someInt: 1
};

要访问,只需:

var text = Constants.someText;