1

我正在为我们正在开发的游戏修改一个模块,它是用 ImpactJS 游戏引擎构建的。我们想要做的是使变量私有或其他类无法访问。

例如:

this.object.variable = 100; // Not okay.
this.object.setVariable( 100 ); // Okay.

ig.module( 
    'game.data.server' 
).requires(

).defines(function(){

    ServerData = ig.class.Extend({
        _variable : -1,

        get variable() {
            return this._variable ;
        },
        setVariable: function( value ) {
            this._variable = value;
        }
    });
});

但是JavaScript setter 和 getter 返回不同的输出

我们无法进行多次修改,因为我们正在开发的其他游戏也可以访问这些内容。

有更好的解决方案吗?

4

1 回答 1

2

第一种可能性

你可以尝试这样做,但由于我没有使用 ImpactJS 开发任何东西,它可能无法按预期工作,因为它取决于.class.extend()函数内部的作用。

但值得一试。

var ServerData = ig.class.Extend((function() {
    var privateVar = -1;
    return {
        getVariable: function() {
            return privateVar;
        },
        setVariable: function(value) {
            privateVar = value;
        }
    };
})());

这段代码对你来说可能有点混乱,但我所做的改变是我创建了一个立即执行的函数来创建一个函数闭包,这是创建私有空间所必需的,我在其中创建了对外部不可见的闭包变量的私有。

我建议您阅读Douglas Crockford 的 Javascript并了解更多关于您正在使用的语言的内容。

第二种可能性

根据评论中的链接,我们似乎也可以define对私人成员使用 ' 闭包:

var privateVar = -1;

var ServerData = ig.class.Extend({
    getVariable: function() {
        return privateVar;
    },
    setVariable: function(value) {
        privateVar = value;
    }
});
于 2014-05-08T05:52:31.427 回答