【问题标题】:Limiting access to JavaScript variables限制对 JavaScript 变量的访问
【发布时间】:2014-06-25 08:42:58
【问题描述】:

我正在为我们正在开发的游戏修改一个模块,它是使用 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 and getter return different outputs

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

有没有更好的解决方案?

【问题讨论】:

  • 这可能会有所帮助:javascript.crockford.com/private.html
  • 谢谢,杰森!我会检查一下。
  • @JasonSperske:可能不依赖于 ImpactJS 的 extend 函数...应该在 JSFiddle 中测试。
  • 关闭/显示模块化模式是一种选择。有了它,您可以将某些变量指定为私有变量。
  • 我想我贴了写的sn-p。对不起。

标签: javascript html setter getter impactjs


【解决方案1】:

第一种可能性

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

但值得一试。

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

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

我建议您阅读 Douglas Crockford's Javascript 并了解更多有关您所用语言的信息。

第二种可能性

根据link in comments 看来我们也可以将define 的闭包用于私有成员:

var privateVar = -1;

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

【讨论】:

  • 这里有一个来自 ImpactJS 论坛 (impactjs.com/forums/help/entity-coding-convention) 的问题,其中包含了一些其他人看到的利用闭包创建私有成员的代码。在他们的示例中,他们在定义中但在扩展之前对它们进行了 var。你的例子也可以(至少在我理解闭包和 JavaScript 的情况下)
  • @JasonSperske: 是的.define 已经创建了一个函数闭包,但是 OP 使用文字对象来扩展内部类定义,我已经在那里创建了一个闭包,因为我说我不知道​​内部工作.extend 函数。根据您的链接,似乎可以对私有成员使用定义的闭包。让我用同样的方法编辑我的答案。
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2012-01-27
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多