commenjs 规范里exports 和 module.exports的关系和区别

1、模块对外输出接口都是通过“module.exports”来实现输出的。即使是通过“exports”定义的接口,也是通过把接口添加到"module.exports"上对外输出的。

2、"exprots"输出的结构如key:value 散列值的字面量对象({ }),module.exprots可以输出任何合法的js数据类型(boolean, number, date, JSON, string, function, array, and so on)。

3、如果“exports”里和"module.exports"定义了相同的字段,那么有定义的会覆盖先定义的。

4、如果“module.exprots”直接被赋予任何合法的js数据类型。那么模块输出仅仅是直接被赋值的数据。(形如:module.exprots=“yyp”;或者module.exprots=funtion(){};)

接下来是见证以上四条依据的时刻:

测试1:

文件1如图:



文件2如图:


输出:


测结果可用 第1条解释。

测试二:

文件1如图:

文件2如图:

输出:

测结果可用 第3条解释。

测试三:

文件1如图:


文件2如图:


输出:


测结果可用 第2、4条解释。


补充:看了express.js的源码后,发现用以上4条解释不了;源代码如下:

[javascript]  view plain copy
  1. /** 
  2.  * Expose `createApplication()`. 
  3.  */  
  4.   
  5. exports = module.exports = createApplication;  
  6.   
  7. /** 
  8.  * Framework version. 
  9.  */  
  10.   
  11. //exports.version = '3.0.0beta7';  
  12.   
  13. /** 
  14.  * Expose mime. 
  15.  */  
  16.   
  17. exports.mime = send.mime;  
  18.   
  19. /** 
  20.  * Create an express application. 
  21.  * 
  22.  * @return {Function} 
  23.  * @api public 
  24.  */  
  25.   
  26. function createApplication() {  
  27.   var app = connect();  
  28.   utils.merge(app, proto);  
  29.   app.request = { __proto__: req };  
  30.   app.response = { __proto__: res };  
  31.   app.init();  
  32.   return app;  
  33. }  

所以又测试了几个不同情况,由于情况多,就不上测试情形了,结合测试又总结了一条:

5:“ module.exports” 要是被赋值Object数据类型(被{ }包起来的数据格式)以外的数据类型之后 。 module.exports就直接返回的是被赋值的非Object数据,
而exports只要背赋值是Object数据类型(被{ }包起来的数据格式)或者函数(也就是可以增加属性的类型)还可以输出接口,如果赋值的数据类型是不能增加属性的,则输不出接口,exports能输出接口的前提是 module.exports的值是Object数据类型(被{ }包起来的数据格式)。

第5条是对第4条的一个补充吧,自己感觉理解的也不深,只是做个笔录,为以后加深理解做铺垫。


"在当前模块下,module对象引用当前模块,因此module.exports与exports指向同一对象的引用。在某些情况下,为了较快捷的取到导出对象,也可以直接覆盖exports对象为要导出的对象。"  摘自-http://blog.csdn.net/zzulp/article/details/8100927

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值