我有以下内容:
function Preferences() {
}
Preferences.players = {
'player1': new Player()
}
player是Preferences的静态成员变量,我试图让它成为包含Player实例的对象。但是,它似乎不允许我这样做。似乎将允许我定义玩家,但是如果我将其设为非静态成员变量。像这样:
function Preferences() {
var players = {
'player1' : new Player()
}
}
是否可以在JS中创建包含对象实例的静态成员变量?
答案 0 :(得分:3)
有几种方法可以做到这一点。您可以直接在函数中执行此操作:
var foo = function() {
if ( typeof foo.static == "undefined" ) {
foo.static = Math.random();
}
};
console.log(foo.static);
foo();
console.log(foo.static);
foo();
console.log(foo.static);
输出:
undefined
0.33120023757048356
0.33120023757048356
或者作为Iggy Kay展示的构造函数的原型。
此外,您可以使用匿名函数模拟静态变量来创建闭包:
var Foo = (function() {
var static = {x: Math.random(), etc:3};
// Instantiable object
return function() {
this.a = Math.random();
this.bar = function() {
console.log(this.a, static);
};
};
})();
var f1 = new Foo(), f2 = new Foo(), f3 = new Foo();
f1.bar();
f2.bar();
f3.bar();
输出:
0.318481237168568 Object { x=0.35319106907436637, more...}
0.5422140103705965 Object { x=0.35319106907436637, more...}
0.30933348253602777 Object { x=0.35319106907436637, more...}
或者与上面相同,但是使用模块模式:
var Foo = (function() {
var static = {x: Math.random(), etc:3};
// Module pattern
return function() {
return {
a: Math.random(),
bar: function() {
console.log(this.a, static);
}
};
};
})();
var f1 = new Foo(), f2 = new Foo(), f3 = new Foo();
f1.bar();
f2.bar();
f3.bar();
输出:
0.2368968219817239 Object { x=0.17619776914569862, more...}
0.5411810225426568 Object { x=0.17619776914569862, more...}
0.3319039598508573 Object { x=0.17619776914569862, more...}
答案 1 :(得分:2)
如果您打算让多个Preferences实例共享静态播放列表,您可以将它们放入原型中:
function Preferences(){}
Preferences.prototype.Players = {'player1': new Player() };
var pref1 = new Preferences();
alert(pref1.Players.player1);
var pref2 = new Preferences();
alert(pref2.Players.player1);