2016-03-28 70 views
0

我想重构一个大的JS代码库从单个文件到多个文件中的多个类。我无法访问我认为应该能够访问的变量。我必须误解JavaScript对象/ NodeJS模块/ exports/imports /引用'this'。NodeJS和ES6类实例中可变的可见性

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

我修改ai.js:

我开始之前,一切按的EcmaScript 6类语法在里面块module.exports = function Ai() { ...

我创建的文件heatMap.js文件ai.js导入HeatMap类,实例化它,并将该对象的引用传递给ai对象,以便热图可以访问其变量。

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

尝试访问currentRound内部热图与this.ai.currentRound收率:

未解决的可变currentRound。

为什么? “this”应该引用实例化的heatMap对象,“ai”应该引用ai对象,并且ai对象具有可变currentRound。使这项工作的一种方法是将所有变量作为参数传递给函数调用,但其中有很多,所以它不会是一个干净的解决方案。

+1

*“”ai“应该引用ai对象”*“,但该对象是否有属性'currentRound'?在你的例子中,你所做的只是创建一个*局部变量*'currentRound',而不是一个属性。也许你打算做'this.currentRound = ...'? –

回答

2

鉴于HeatMap定义:

module.exports = HeatMap; 

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

而且AI定义:

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

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

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

您应该看到印在从AI实例调用bookKeeping()0

我不使用ES2015类,但从我看到的,你的范围是错误的。您的currentRound变量在本地作用域为AI函数,并未以任何方式公开(在您提供的代码段中)。因此,当您将AI的实例传递给HeatMapcurrentRound可用于AI构造函数公开的方法,但不可用于HeatMap函数本身。