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 相关文章推荐
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
May 28 Javascript
用js编写的简单的计算器代码程序
Aug 04 Javascript
jquery 表单验证之通过 class验证表单不为空
Nov 02 Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 Javascript
JavaScript暂停和继续定时器的实现方法
Jul 18 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
微信小程序“摇一摇”的实例代码
Jul 20 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
Oct 30 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 Javascript
vue自动添加浏览器兼容前后缀操作
Aug 13 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
?生?D片??C字串
2006/12/06 PHP
php记录日志的实现代码
2011/08/08 PHP
PHP中怎样防止SQL注入分析
2014/10/23 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
js实现随机点名
2021/01/19 Javascript
Python如何为图片添加水印
2016/11/25 Python
python绘制立方体的方法
2018/07/02 Python
Django REST framework视图的用法
2019/01/16 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
新年晚会主持词
2014/03/24 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
KVM基础命令详解
2022/04/30 Servers
python神经网络 使用Keras构建RNN训练
2022/05/04 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL