在哪里声明类常量?

时间:2011-01-25 02:08:29

标签: javascript conventions

我正在使用类成员来保存常量。 E.g:

function Foo() {
}

Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;

这种方法很好,除了它似乎有点无组织,所有特定于Foo的代码都在全局范围内。所以我考虑将常量声明移到Foo()声明中,但那么每次构造Foo时都不会执行该代码吗?

我来自Java,其中所有东西都包含在一个类体中,所以我认为JavaScript可能有类似的东西或一些模仿它的工作。

9 个答案:

答案 0 :(得分:30)

您在代码中所做的只是向名为Foo的Function对象添加名为CONSTANT且值为1的属性,然后立即使用值2覆盖它。< / p>

我对其他语言不太熟悉,但我不相信javascript能够做你似乎正在尝试的事情。

您要添加到Foo的所有属性都不会执行。它们只是存储在该命名空间中。

也许您想将某些属性原型化到Foo

function Foo() {
}

Foo.prototype.CONSTANT1 = 1;
Foo.prototype.CONSTANT2 = 2;

虽然不是你想要的。

答案 1 :(得分:14)

你必须像你说的那样制作你的常数:

function Foo() {
}

Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;

你可以这样访问:

Foo.CONSTANT1;

anInstanceOfFoo.__proto__.constructor.CONSTANT1;

当您创建其他对象时,所有其他解决方案都会分配内存的其他部分,因此它不是常量。 你不应该那样做:

Foo.prototype.CONSTANT1 = 1;

答案 2 :(得分:3)

如果仅在对象内部使用常量:

function Foo() {
    var CONSTANT1 = 1,CONSTANT2 = 2;
}

如果没有,请这样做:

function Foo(){
    this.CONSTANT1=1;
    this.CONSTANT2=2;
}

它更易读,更容易弄清楚函数的作用。

答案 3 :(得分:3)

如果您正在使用jQuery,则可以使用$ .extend函数对所有内容进行分类。

var MyClass = $.extend(function() {
        $.extend(this, {
            parameter: 'param',
            func: function() {
                console.log(this.parameter);
            }
        });
        // some code to do at construction time
    }, {
        CONST: 'const'
    }
);
var a = new MyClass();
var b = new MyClass();
b.parameter = MyClass.CONST;
a.func();       // console: param
b.func();       // console: const

答案 4 :(得分:2)

你正在做的事情很好(假设你意识到你的例子只是设置了两次相同的属性);它相当于Java中的静态变量(尽可能接近,至少没有做很多工作)。此外,它不完全是全局的,因为它在构造函数上,它实际上被命名为你的“类”。

答案 5 :(得分:2)

首先,我建议在IIFE内移动您的类声明。这样可以清理代码,使其更加自包含,并允许您使用局部变量而不会污染全局命名空间。您的代码变为:

var Foo = (function() {
  function Foo() {
  }

  Foo.CONSTANT1 = 1;
  Foo.CONSTANT2 = 2;

  return Foo;
})();

将常量作为属性直接分配给类的问题是那些是可写的。请参阅以下代码段:

&#13;
&#13;
var output = document.getElementById("output");

var Foo = (function() {
  function Foo() {
  }

  Foo.CONSTANT1 = 1;
  Foo.CONSTANT2 = 2;

  return Foo;
})();

Foo.CONSTANT1 = "I'm not very constant";

output.innerHTML = Foo.CONSTANT1;
&#13;
<div id="output"></div>
&#13;
&#13;
&#13;

我找到的最佳解决方案是定义只读属性以访问类外的常量。

&#13;
&#13;
var output = document.getElementById("output");

var Foo = (function() {
  const CONSTANT1 = "I'm very constant";

  function Foo() {
  }

  Object.defineProperty(Foo, "CONSTANT1", {
    get: function() {
      return CONSTANT1;
    },
  });

  return Foo;
})();

Foo.CONSTANT1 = "some other value";

output.innerHTML = Foo.CONSTANT1;
&#13;
<div id="output"></div>
&#13;
&#13;
&#13;

(从技术上讲,你可以放弃const CONSTANT1语句,只返回属性定义中的值,但我更喜欢这个,因为它可以让你更容易一目了然地查看所有常量。)

答案 6 :(得分:1)

你的常量只是变量,你不会知道你是否尝试过无意中覆盖它们。另请注意,Javascript缺乏“类”的概念。

我建议您创建返回需要不变的值的函数。

要了解Javascript,请找Javascript: the Good Parts并了解惯用法。 Javascript与非常与Java不同。

答案 7 :(得分:1)

还有名称空间

var Constants = {
    Const1: function () {
        Const1.prototype.CONSTANT1 = 1;
        Const1.prototype.CONSTANT2 = 2;
    },

    Const2: function () {
        Const2.prototype.CONSTANT3 = 4;
        Const2.prototype.CONSTANT4 = 3;
    }
};

答案 8 :(得分:0)

你说你来自Java - 你为什么不把这个类存储在1个文件中,然后在文件末尾存储常量。这就是我使用的:

filename:PopupWindow.js

function PopupWindow() {
    //private class memebers
    var popup, lightbox;
    //public class memeber or method (it is the same in JS if I am right)
    this.myfuncOrmyMemeber = function() {};
}

//static variable
PopupWindow._instance = null;
//same thing again with constant-like name (you can't have "final" in JS if I am right, so it is not immutable constant but its close enough ;) - just remember not to set varibales with BIG_LETTERS :D)
PopupWindow.MY_CONSTANT = 1;
//yea, and same thing with static methods again
PopupWindow._getInstance = function() {};

所以唯一不同的是静态东西的位置。它并没有在类花括号中精确对齐,但谁在乎,它总是在IDE中单击ctrl +(或者我使用ctr + l来显示所有类方法 - IntellijIdea可以在JS dunno中做到这一点,其他IDE如何)所以你不会用你的眼睛搜索;)

是的,我在静态方法之前使用_ - 不需要它,我不知道为什么我开始这样做:)