1.循环问题当在循环中调用require()时,可能会在执行不完整时返回模块。例如:a.js:exports.done=false;constb=require('./b.js');console.log('ina,b.done=%j',b.done);exports.done=true;console.log('aends');b.js:console.log('bstarts');exports.done=false;consta=require('./a.js');console.log('inb,a.done=%j',a.done);exports.done=true;console.log('bends');main.js:console.log('mainstarts');consta=require('./a.js');constb=require('./b.js');console.log('inmain,a.done=%j,b.done=%j',a.done,b.done);当main.js加载a.js时,a.js加载b.js。此时b.js会尝试加载a.js。为防止无限循环,将a.js导出对象的未完成副本返回给b.js模块。然后b.js完成加载并将exports对象提供给a.js模块。当main.js加载这两个模块时,它们都已经加载。所以这个程序的输出是:$nodemain.jsmainstartastartbstartinb,a.done=falsebendina,b.done=trueaendinmain,a.done=true,b.done=true需要仔细规划以允许循环模块依赖项在应用程序中正常工作。2.原型继承问题需要注意的是,call、apply、bind方法只能继承对象的方法,不能对它们的原型进行复制或继承,我们一般采用混合写法,使用原型链和(apply或call)继承的方法。在nodeJS中,util包提供了一个方法util.inherits(constructor,superConstructor),所以必须如下,使用call和inherits结合使用完全可以复制:functionGirl(name){this.name=姓名;事件发射器。call(this);}util.inherits(Girl,EventEmitter);vargirl=newGirl();请注意,不推荐使用util.inherits()。请使用ES6的class和extends关键字来实现语言级别的继承支持。请注意,这两种方法在语义上是不兼容的。constructor
