ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

两分钟搞定module.exports与exports区别

2022-05-14 02:00:07  阅读:205  来源: 互联网

标签:node exports 对象 导出 搞定 module 赋值


两分钟搞定module.exports与exports区别:https://www.cnblogs.com/fightjianxian/p/12150940.html

 

exports和module.exports区别

  1、分析

我们可以从底层实现去理解:在node里每个模块内部都有一个自己的对象module,而该module对象里,有一个子对象exports

    

在node里,谁require该文件,谁就得到module.exports接口对象

    

     

我们发现,每次导出接口成员时通过module.exports.xxx = xxx的方式很麻烦,都得通过点.方式
因此node为了简化操作,专门提供了一个变量:exports = module.exports

    也就是说在模块底层实现里,还有这么一句代码

var exports = module.exports

    测试如下

    

     

  2、原理解析

exports是module.exports的一个引用

   

  3、导出单个模块

当导出单个模块时,需要module.exports即可

    

  4、思考进阶(面向对象--引用类型)

    为什么导出单个对象不可以使用exports = xxx;直接赋值定义导出???

    

     

     原理图:引用数据类型

    

接下来再看个思考题

    

     结果为hello,为什么呢?

当给obj1重新赋值后,它便指向了新对象,开辟了新的内存空间,如下所示,此时两者已经没有关系

    

综上分析不能使用exports = xxx来直接导出单个成员

    

复制代码
var exports = module.exports
类似于
var obj1 = obj
这里exports只是module.exports的一个引用,所以这里直接给exports直接赋值,并不会影响module.exports,只是指向了新对象而已。
始终要记住:底层实现里最后返回的是module.exports对象
复制代码

    

 

  5、重新赋值,解除引用

此外,这里要注意:一旦给exports重新赋值,便会失去和module.exports的关联,指向新对象,且后期无法使用。
如下所示

    

    

     

  6、思考2

对上述代码再次修改如下

    

     结果如下

    

   7、思考3

再使用module.exports添加如下

    

     

  8、思考4

接下来再做下调整

    

     原理如下:

    

     换为exports与module.exports

     重定义

这里注意:此时两者已经没有引用关系,最终return的是module.exports所以只需要看module.exports即可

   9、思考5

接着修改代码

    

    

   10、思考6

    

     

    

  11、小结

复制代码 复制代码
1、exports为modules.exports的一个引用
2、最后node底层模块导出的是module.exports
3、底层代码
    var module = {
        exports:{...}
    } 
4、exports.name等价于module.exports.name,但node为了方便书写,使用module.exports导出单个成员,本质为将该子对象重新赋值  
5、所以只要给exports赋值,便丢失了module.exports的引用关系,后期便不可用
复制代码 复制代码

  

 

 

标签:node,exports,对象,导出,搞定,module,赋值
来源: https://www.cnblogs.com/bydzhangxiaowei/p/16268965.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有