1.Module、module.exports、exports含义模块对象:每个.js自定义模块中都有一个模块对象,里面存放着当前模块相关的信息Informationmodule.exports对象:在node中的自定义模块中,可以使用module.exports对象共享自定义模块的一些成员以供使用。当外界(其他js文件)使用require()方法导入自定义模块时,获取的是module.exports指向的对象exports对象:因为module.exports这个词写起来比较复杂,为了为了简化对外共享成员的代码,Node提供了一个exports对象。默认情况下,exports和module.exports指向同一个对象。注意:当使用require()方法导入模块时,导入的结果总是基于module.exports指向的对象。也就是说,最终的共享结果还是module。以exports指向的对象为准2.案例理解两者关系案例1:定义代码//文件名:01.module.exports和exports误解exports.name="小吴"module.exports={性别:"Male",age:18Outputcode//filename:01-test//为了测试module.exports,exports指向结果案例2、3、4的输出代码都是这个js代码文件constobj=require("./01.module.exportsandexportserror")console.log(obj);输出说明:因为默认情况下,exports和module.exports指向同一个对象,所以一开始都指向一个空对象,当export指向一个新的objectname="小吴"后,两者都指向这个时候是这个对象,但是执行下面的代码之后,在内存中开辟了一个新的空间来存放一个新的对象{gender:"male",age:18},并将这个新对象的引用交给module.exports,则module.exports指向的是新对象,而不是之前的空对象,并且由于最终共享的结果,以module.exports指向的对象为准,所以案例输出如上图所示示例2定义代码module.exports.name="XiaoWu"exports={Gender:"Male",age:18}输出结果说明:同理,当module.exports指向对象name="XiaoWu"时,执行以下代码,exports指向新对象{gender:"male",age:18},因为最终分享的结果还是以module.exports指向的对象为准,所以案例输出如上图图Case3定义代码exports.name="XiaoWu"module.exports.age=18outputresult解释:同样,两者开始指向一个空对象,第一行代码通过exports引用挂载了一个name属性关系,第二行通过module.exports引用关系挂载了一个name属性Loadedapropertyagethis如果里面没有新的对象,都是挂载的属性。这两个属性放在一开始两个指向的空对象中,然后最后两个属性在这个对象中,而module.exports指向这个对象,所以最终输出如上案例4定义代码exports={Gender:"Male",name:"XiaoWu",}module.exports=exports//通过等号将export的引用关系赋值给module.exportsmodule.exports.age=18输出结果说明:同理,两者开始指向同一个空对象,执行代码,在内存中定义一个新对象,并将新对象挂载到exports上,此时exports不再指向之前的空对象,而是指向新的Defined对象,module.exports=exports这行代码通过等号将export的引用关系赋值给module.exports,则module.exports不指向之前的空对象,还指向新的对象,最后指向module。exports指向的新对象继续挂载了一个age属性,所以里面的所有属性都被module.exports指向了,所以最终的结果输出如图所示。在模块中同时使用exports和module.exports关键字:前端训练
