NodeJS和ES6类实例中的可变可见性

时间:2016-03-28 16:28:04

标签: javascript node.js ecmascript-6

我正在尝试将大型JS代码库从单个文件重构为多个文件中的多个类。我无法访问我认为应该能够访问的变量。我必须误解一下javascript对象/ NodeJS模块/导出/导入/引用'this'。

在开始之前,所有内容都在块module.exports = function Ai() { ...

内的文件ai.js中

我根据EcmaScript 6 Class语法创建了文件 heatMap.js

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

我修改了 ai.js 来导入HeatMap类,实例化它,并将对象传递给ai对象,以便热图可以访问它的变量。

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

尝试使用this.ai.currentRound访问heatMap内的currentRound:

  

未解决的变量currentRound。

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

1 个答案:

答案 0 :(得分:2)

鉴于$result->Offer->Merchant->Logo->Url 定义:

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); } 的实例调用0时看到bookKeeping()

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