我中的古典程序员爱上了OO的公共/私有范例,我发现很难放弃。这使我遇到了我希望您能帮助我的问题。
我有一个名为map的单例对象。只可以有一个人。该地图包含名为Star的对象(这是一个游戏)。星星看起来像这样:
var Star = function(id, x, y) {
this.id_ = parseInt(id);
this.x_ = parseInt(x);
this.y_ = parseInt(y);
};
实际上,还有更多的参数和属性。这只是一个例子。
地图的定义如下:
var map = (function() {
// public interface
return {
init: function() {
getStars();
},
stars: {} // works but publicly accessible
};
var stars = new Array(); // fail
function getStars() {
$.getJSON("ps.php?jsoncallback=?", addStars);
}
function addStars(data) {
for (var x=0, xx=data.stars.length; x<xx; x++) {
map.stars[data.stars[x].id] = new Star(
data.stars[x].id,
data.stars[x].xpos,
data.stars[x].ypos
);
}
}
})();
我认为由于
addStars
的范围是$.getJSON
的回调函数,因此它无法将新创建的star添加到star的私有变量中(FireBug表示未定义,jQuery尝试在abort
中调用添加)。但是,如果我将星星设置为公开可见的对象,那么它确实可以工作,但是从界面上看不到星星,这不是我想要的。如何保持星星的私密性,并使其可通过JSON回调访问?
最佳答案
您可以引用stars
而不在其前面的map
。
var map = (function() {
var stars = new Array();
function getStars() {
$.getJSON("ps.php?jsoncallback=?", addStars);
}
function addStars(data) {
for (var x=0, xx=data.stars.length; x<xx; x++) {
stars[data.stars[x].id] = new Star(
data.stars[x].id,
data.stars[x].xpos,
data.stars[x].ypos
);
}
}
// this should be at the bottom.
// public interface
return {
init: function() {
getStars();
}
};
})();
在与
addStars
相同的作用域上下文中定义stars
会创建一个闭包,使stars
在调用函数时可用。关于javascript - javascript类中的作用域问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3814305/