当前位置: 首页 > 后端技术 > Node.js

【渗透】Node.js经典题

时间:2023-04-04 01:26:30 Node.js

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关键字来实现语言级别的继承支持。请注意,这两种方法在语义上是不兼容的。constructorsuperConstructor将原型方法从一个构造函数继承到另一个构造函数。构造函数的原型将设置在从superConstructor创建的新对象上。superConstructor可以通过constructor.super_属性访问。constutil=require('util');constEventEmitter=require('events');functionMyStream(){EventEmitter.call(this);}util.inherits(MyStream,EventEmitter);MyStream.prototype.write=function(data){this.emit('data',data);};conststream=newMyStream();console.log(streaminstanceofEventEmitter);//trueconsole.log(MyStream.super_===EventEmitter);//truestream.on('data',(data)=>{console.log(`收到的数据:"${data}"`);});stream.write('工作顺利!');//接收到的数据:“工作正常!”示例:使用ES6类并扩展:constEventEmitter=require('events');classMyStreamextendsEventEmitter{write(data){this.emit('data',data);}}conststream=newMyStream();stream.on('data',(data)=>{console.log(`接收到的数据:"${data}"`);});stream.write('使用ES6');