Javascript NodeJS:Early require不需要';无法访问对象字段

Javascript NodeJS:Early require不需要';无法访问对象字段,javascript,node.js,require,Javascript,Node.js,Require,我在访问文件顶部需要/导入的对象中的字段时遇到问题,但是在代码的稍后点再次导入对象时,该字段是可访问的 我举了一个小例子来说明我的意思: main.js: var ClassA = require('./ClassA'); ClassA.init(); var ClassB = require('./ClassB'); var ClassA = function() {}; ClassA.init = function() { // Define a variable in C

我在访问文件顶部需要/导入的对象中的字段时遇到问题,但是在代码的稍后点再次导入对象时,该字段是可访问的


我举了一个小例子来说明我的意思:

main.js

var ClassA = require('./ClassA');

ClassA.init();
var ClassB = require('./ClassB');

var ClassA = function() {};

ClassA.init = function() {
    // Define a variable in ClassA
    this.myVar = 'My Value';

    // Create an instance of ClassB, and try to print the defined variable
    var myClass = new ClassB();
    myClass.printMyVar();
};

module.exports = ClassA;
var ClassA = require('./ClassA');

var ClassB = function() {};

ClassB.prototype.printMyVar = function() {
    // Print the variable (not working)
    console.log('My Var: ' + ClassA.myVar);

    // Require ClassA again
    ClassA = require('./ClassA');

    // Print the variable again (working)
    console.log('My Var (again): ' + ClassA.myVar);
};

module.exports = ClassB;
ClassA.js

var ClassA = require('./ClassA');

ClassA.init();
var ClassB = require('./ClassB');

var ClassA = function() {};

ClassA.init = function() {
    // Define a variable in ClassA
    this.myVar = 'My Value';

    // Create an instance of ClassB, and try to print the defined variable
    var myClass = new ClassB();
    myClass.printMyVar();
};

module.exports = ClassA;
var ClassA = require('./ClassA');

var ClassB = function() {};

ClassB.prototype.printMyVar = function() {
    // Print the variable (not working)
    console.log('My Var: ' + ClassA.myVar);

    // Require ClassA again
    ClassA = require('./ClassA');

    // Print the variable again (working)
    console.log('My Var (again): ' + ClassA.myVar);
};

module.exports = ClassB;
ClassB.js

var ClassA = require('./ClassA');

ClassA.init();
var ClassB = require('./ClassB');

var ClassA = function() {};

ClassA.init = function() {
    // Define a variable in ClassA
    this.myVar = 'My Value';

    // Create an instance of ClassB, and try to print the defined variable
    var myClass = new ClassB();
    myClass.printMyVar();
};

module.exports = ClassA;
var ClassA = require('./ClassA');

var ClassB = function() {};

ClassB.prototype.printMyVar = function() {
    // Print the variable (not working)
    console.log('My Var: ' + ClassA.myVar);

    // Require ClassA again
    ClassA = require('./ClassA');

    // Print the variable again (working)
    console.log('My Var (again): ' + ClassA.myVar);
};

module.exports = ClassB;
当执行
main.js
时,我得到以下输出:

My Var: undefined
My Var (again): My Value

为什么第一行显示变量未定义,为什么在再次要求/导入对象后正确显示变量


这是由循环依赖性引起的吗?如果是,我以后如何避免这个问题?

这就是所描述的情况。解决方案似乎是增加
导出
对象,而不是在存在循环依赖关系时替换它

下面是他们的示例,修改后显示当
b
稍后检查
a.done
时,它会看到正确的值:

a、 js:

b、 js:

main.js:

console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
b.check();
输出为:

main starting a starting b starting in b, a.done = false b done in a, b.done = true a done in main, a.done=true, b.done=true in b's check function, a.done = true 主起动 起点 b开始 在b中,a.done=false b完成 在a中,b.done=true 完成 大体上,a.done=true,b.done=true 在b的check函数中,a.done=true
谢谢,这很有帮助。我想您的意思是我应该向
模块中添加函数/字段。导出
,而不是将其完全替换为,例如
ClassA
。如果是这样,您将如何定义类的构造函数?我在这篇评论中问了一个类似的问题:@timvise:NodeJS本身在某些情况下的做法非常类似:如果愿意,模块定义一个“名称空间”(导出对象),单个类可以作为该对象的属性,而不是顶级。例如,像
fs.FSWatcher
fs.Stats
等,但它们不一致:事件模块将
导出
对象替换为
事件发射器
。(我怀疑ES2015的模块将解决这个问题,但这可能是我一厢情愿的想法…)谢谢。我想我应该尽量避免循环依赖,让一切都更加模块化。@Timviseée:我相信这是最好的办法。:-)