2017-01-25 6 views
0

外部関数を呼び出すときに閉鎖が失敗しそう:アイデアはGraphicsGraphics()機能を呼び出すことにより、内部コードから視覚的にコードを分離することである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メソッドは、最初に宣言されたinitメソッドで割り当てられたプライベート変数を失い、Graphicsの何らかのメソッドで呼び出されたときはいつもUncaught ReferenceError: private is not definedを吐き出します。

Graphics()でこれらの秘密を再割り当てするのは1つの解決策だと思っていますが、それは多分目的を殺すでしょう。誰でも良い考えがありますか?前もって感謝します。

編集:コードは少し簡単に、あなたのグラフィックスタイプがそれらにアクセスべきではありませんプライベート変数をしたい場合は、私が

+0

それはあなたの何私にははっきりしていません実際の質問。期待どおりに動作しないものはありますか?その場合は、再現可能な例を提供してください。 – abl

+0

上記のコードスニペットは構文的に間違っています。それを修正してください。 – alicanerdogan

答えて

0

で取得していますかを理解するために作られました。代わりにパブリック変数を宣言するのはどうですか?例えばこのよう

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

それとも、プライベートフィールドにアクセスし、グラフィックスタイプにゲームのインスタンスを渡すためにゲッターを宣言することができます。このように:

let Game = function() { 

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

} 

function Graphics(game) { 

    // ... 

} 
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(){ 

}; 

をし、その上:

var myGame = new Game(); 
関連する問題