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 相关文章推荐
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
Js日期选择器并自动加入到输入框中示例代码
Aug 02 Javascript
jqueryUI里拖拽排序示例分析
Feb 26 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
详解Node.js串行化流程控制
May 04 Javascript
jQuery实现轮播图效果
Nov 26 jQuery
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
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程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
jquery 3D 标签云示例代码
2014/06/12 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Django多数据库的实现过程详解
2019/08/01 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
高三体育教学反思
2014/01/29 职场文书
合作协议书模板
2014/10/10 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS