我中的古典程序员爱上了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/

10-10 16:29