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:我相信这是最好的办法。:-)