【发布时间】:2011-04-18 09:02:43
【问题描述】:
我的经典程序员爱上了 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 的回调函数,它不能将新创建的星添加到星的私有变量中(FireBug 说它是未定义的,jQuery 在之后调用abort它试图添加它)。但是,如果我将星星设为公开可见的对象,那么它确实可以工作,但是从界面可以看到星星,这不是我想要的。
我怎样才能保持星星的私密性并使其可以从 JSON 回调中访问?
【问题讨论】:
-
@SLaks: 或者可能是
Number(x)甚至+x,因为它们没有以 8 为基数的解析。 IMO,parseInt()仅在文本可能跟在数字后面时才需要。 -
但是由于从 JSON 返回的所有项目都是字符串,因此肯定需要将那些是数字的项目从字符串转换为数字,这就是 parseInt 所做的。 Number 是否提供比 parseInt 更好的性能?
标签: javascript class callback scope