Node.js 中exports 和 module.exports 的区别


Posted in Javascript onMarch 14, 2017

Node.js 中exports 和 module.exports 的区别

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例:

test.js

var a = {name: 1};
var b = a;

console.log(a);
console.log(b);

b.name = 2;
console.log(a);
console.log(b);

var b = {name: 3};
console.log(a);
console.log(b);

运行 test.js 结果为:

{ name: 1 }
{ name: 1 }
{ name: 2 }
{ name: 2 }
{ name: 2 }
{ name: 3 }

解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。

明白了上述例子后,我们只需知道三点就知道 exports 和 module.exports 的区别了:

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

现在我们来看 Node.js 官方文档的截图:

Node.js 中exports 和 module.exports 的区别

我们经常看到这样的写法:

exports = module.exports = somethings

上面的代码等价于:

module.exports = somethings
exports = module.exports

原理很简单,即 module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exports 让 exports 重新指向 module.exports 即可。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 Javascript
详解AngularJS 路由 resolve用法
Apr 24 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 Javascript
一篇文章带你从零快速上手Rollup
Sep 07 Javascript
JS检测数组类型的方法小结
Mar 14 #Javascript
轻松理解JavaScript闭包
Mar 14 #Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 #Javascript
JavaScript ES6中export、import与export default的用法和区别
Mar 14 #Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 #Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
Mar 14 #Javascript
vuejs响应用户事件(如点击事件)
Mar 14 #Javascript
You might like
PHP+javascript模拟Matrix画面
2006/10/09 PHP
PHP新手上路(二)
2006/10/09 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
jQuery 操作XML入门
2008/12/25 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
python3调用R的示例代码
2018/02/23 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
详解python数据结构和算法
2019/04/18 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
什么是继承
2013/12/07 面试题
机械工程师求职自我评价
2013/09/23 职场文书
保护环境倡议书300字
2014/05/19 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
导师对论文的学术评语
2015/01/04 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
css3带你实现3D转换效果
2022/02/24 HTML / CSS
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
使用python绘制分组对比柱状图
2022/04/21 Python