2016-03-28 11 views
0

私は、1つのファイルから大きなJSコードベースを複数のファイルの複数のクラスにリファクタリングしようとしています。私はアクセスできるはずの変数にはアクセスできません。私はjavascriptオブジェクト/ NodeJSモジュール/ exports/imports/'this'を参照していることを誤解しているはずです。私はai.jsを修正NodeJSとES6のクラスインスタンスの可視性

module.exports = HeatMap; 
class HeatMap { 
    constructor(ai, ...) { 
     this.ai = ai; 
     ... 
    } 
    ... 
} 

:私は開始前に

は、すべてがECMAScriptの6クラスの構文に従って、私はファイルheatMap.jsを作成module.exports = function Ai() { ...

ブロック内のファイルai.jsにありましたを使用してヒートマップクラスをインポートし、インスタンス化し、ヒートマップがその変数にアクセスできるようにオブジェクトにaiオブジェクトへの参照を渡します。

未解決の変数currentRound:this.ai.currentRound収率でヒートマップ内currentRoundにアクセスしようとしている

const HeatMap = require("heatMap.js"); 
module.exports = function Ai() { 
    var ai = this; 
    var currentRound = ... 
    ... 
    function bookKeeping(...) { 
     heatMap = new HeatMap(ai,...); 
     ... 
    } 
    ... 
} 

なぜですか? "this"はインスタンス化されたheatMapオブジェクトを参照し、 "ai"はaiオブジェクトを参照し、aiオブジェクトは変数currentRoundを持つ必要があります。この作業を行う1つの方法は、すべての変数を関数呼び出しのパラメータとして渡すことですが、その多くがありますので、クリーンな解決策ではありません。あなたは0AIのインスタンスからbookKeeping()を呼び出すに印刷されるはずです

module.exports = AI; 
const HeatMap = require('HeatMap'); 

function AI() { 
    this.currentRound = 0; 
} 

AI.prototype.bookKeeping = function bookKeeping() { 
    const heatMap = new HeatMap(this); 
} 

module.exports = HeatMap; 

function HeatMap(ai) { 
    console.log(ai.currentRound); 
} 

そしてAI定義:

+1

* "" ai "はaiオブジェクト" *を参照する必要がありますが、このオブジェクトは 'currentRound'プロパティを持っていますか?あなたの例では、ローカル変数* currentRound'をプロパティではなく作成しています。おそらく、あなたは 'this.currentRound = ...'を行うつもりでしたか? –

答えて

2

HeatMap定義を考えます。

私はES2015クラスを使用していませんが、私の見ているところからは範囲が間違っています。 currentRound変数はローカルでAI関数にスコープされており、(提供したスニペットでは)決して公開されません。したがって、AIのインスタンスをHeatMapcurrentRoundに渡すときは、AIコンストラクタによって公開されるメソッドでは使用できますが、HeatMap関数では使用できません。