Javascript - 调用外部函数时{Closure失败

时间:2017-01-25 13:15:55

标签: javascript

我目前制作的游戏结构很小:

let Game = function() {

    let privateVar;
    // private would be an example private variable assigned later
    // Other private variables go here

    return {
        Engine: function() {

            // More specific private variables

            init: function() {
                privateVar = this.sampleValue;
                // Game.Engine.sampleValue doesn't help either

                // Start up everything, for example, calling a Graphics method:
                Game.Graphics.method1();
            },

            sampleValue: 10,

            // Other methods
        }

        Graphics: Graphics()
    }
}

function Graphics() {

    // Visuals-specific private variables

    return {

        method1: function() {
            console.log(privateVar);
            // This would complain about the variable not being defined
        }

        // methods

    }
}

Game.Engine.Init();

想法是通过调用Graphics()方法中的Graphics函数将可视代码与内部代码分开(因此我可以在单独的文件中构建Graphics()函数例如)。但是,当我执行此操作时,Graphics方法会丢失我在开头声明并在init方法中分配的私有变量,并且只要它被调用,就会吐出Uncaught ReferenceError: private is not defined Graphics中的一些方法。

我想一个解决方案就是重新分配Graphics()中的那些私有,但这有点会破坏目的。谁有更好的主意?提前谢谢。

编辑:让代码更容易理解我在

获得的内容

2 个答案:

答案 0 :(得分:0)

如果您想要私有变量,您的Graphics类型不应该访问它们。如何改为声明公共变量?

比如说:

let Game = function() {
    this.publicVar = "value";
}

或者您可以声明getter访问私有字段并将Game实例传递给Graphics类型。像这样:

let Game = function() {

    let privateVar = "value";
    this.getPrivateVar = function() {
        return privateVar;
    }

}

function Graphics(game) {

    // ...

}

答案 1 :(得分:0)

我认为您正在尝试使用O.O.在javascript中。 Javascript是原型,所以,你将使用O.O.与通常的语言不同。 see mozilla reference

我认为你应该创建像这样的js类:

/**
 * @class  Game Class
 */
function Game() {

    this.privateProperty;

    this.engine = new Engine(); //engine object of this game
    this.graphics = new Graphics(); //graphics object of this game
}

Game.prototype.oneGameMethod = function(){

};


/**
 * @class Engine Class
 */
function Engine(){
    this.privateProperty;   

}

Engine.prototype.oneEngineMethod = function(){

};


/**
 * @class  Graphics class
 */
function Graphics() {

    // Visuals-specific private variables
    this.visualProperty;
}
Graphics.prototype.oneMethodExample = function(){

};

您可以创建一个Game对象并调用其方法等等:

var myGame = new Game();