我正在使用类成员来保存常量。 E.g:
function Foo() {
}
Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;
这种方法很好,除了它似乎有点无组织,所有特定于Foo
的代码都在全局范围内。所以我考虑将常量声明移到Foo()
声明中,但那么每次构造Foo
时都不会执行该代码吗?
我来自Java,其中所有东西都包含在一个类体中,所以我认为JavaScript可能有类似的东西或一些模仿它的工作。
答案 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;
})();
将常量作为属性直接分配给类的问题是那些是可写的。请参阅以下代码段:
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;
我找到的最佳解决方案是定义只读属性以访问类外的常量。
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;
(从技术上讲,你可以放弃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如何)所以你不会用你的眼睛搜索;)
是的,我在静态方法之前使用_ - 不需要它,我不知道为什么我开始这样做:)