浅谈node中的exports与module.exports的关系


Posted in Javascript onAugust 01, 2017

因为是做前端的,对node的生态一直也比较关注,对于node中对commonJS模块化的实现给了我们很大的方便,之前对于导出的module.exports和exports一直模模糊糊,今天做一个整理

先来个js基础部分的复习

let obj1 = {}
let obj2 = obj1
obj2.a = 'a'
obj1.b = 'b'
console.log(obj1) //{a: 'a', b: 'b'}
console.log(obj2) //{a: 'a', b: 'b'}
obj2 = {}
console.log(obj2) //{}
console.log(obj1) //{a: 'a', b: 'b'}

obj1先指向内存中的一个区块,然后将obj1指向内存区块的引用传递给了obj2,那么这时obj1和obj2都指向了内存中的同一个区块,所以无论是通过obj1还是obj2向这块内存中加入属性,都会同时反应在obj1和obj2的身上,这时候obj2切断了与原先内存块的联系,指向了新的内存块,而obj1还是指向最先的内存区块,这时他们就各自管理各自的内存区块

现在看看module.exports和exports的关系

如图最开始的时候module.exports和exports都指向同一块内存区域,红线包含的区域,其中module.exports指向的区域用灰色填充

浅谈node中的exports与module.exports的关系

初始

现在我们导出为module.exports = {a: "a"},那么module.exports切断与原来的红色线包围的内存块,指向新的内存块还是灰色填充的内存块,如图

浅谈node中的exports与module.exports的关系

导出module.exports

或者是我们导出为exports = {a: "a"},那么exports切断与原来的红线包含的内存块,指向新的内存块,如图

浅谈node中的exports与module.exports的关系

导出为exports

重要的是我们通过require导入的永远都是module.exports,即图中灰色填充的内存块,而不是红色线条的最初始的内存块,所以无论我们在导出的时候是用module.exports还是exports只要保证导出的内容是挂载在灰色内存块上都是可行的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的类继承
Nov 25 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
纯JavaScript实现的分页插件实例
Jul 14 Javascript
JS实现仿FLASH效果的竖排导航代码
Sep 15 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
Mar 18 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
javascript实现右下角广告框效果
Feb 01 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
Jul 13 Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 #Javascript
谈谈VUE种methods watch和compute的区别和联系
Aug 01 #Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 #Javascript
详解js静态资源文件请求的处理
Aug 01 #Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 #Javascript
jQuery上传插件webupload使用方法
Aug 01 #jQuery
js实现鼠标拖拽多选功能示例
Aug 01 #Javascript
You might like
getimagesize获取图片尺寸实例
2014/11/15 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
10个简化PHP开发的工具
2014/12/25 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
图解javascript作用域链
2019/05/27 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
Python写的贪吃蛇游戏例子
2014/06/16 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
长青弘远的面试题
2012/06/09 面试题
工商管理专业实习生自我鉴定
2013/09/29 职场文书
车间机修工岗位职责
2014/02/28 职场文书
乌镇导游词
2015/02/02 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
故意伤害辩护词
2015/05/21 职场文书
员工工作心得体会
2019/05/07 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android