我试图将大型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。进行此工作的一种方法是将所有变量作为函数调用中的参数传递,但是其中有很多变量,因此这不是一个干净的解决方案。
最佳答案
给定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()
时,应该看到AI
打印出来。我不使用ES2015类,但从我的角度来看,您的范围是错误的。您的
currentRound
变量在本地作用于AI
函数,并且不会以任何方式公开(在您提供的代码段中)。因此,当您将AI
的实例传递给HeatMap
时,currentRound
可用于AI
构造函数公开的方法,但不适用于HeatMap
函数本身。关于javascript - NodeJS和ES6类实例中的变量可见性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36266467/