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 官方文档的截图:

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

exports = module.exports = somethings

上面的代码等价于:

module.exports = somethings
exports = module.exports

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MasiMaro 的技术博文

C++继承

在封装的过程中,我们发现有很多地方有问题,比如我们在封装Windows API 的过程中,每个窗口都有各自的消息处理,而我们封装时不同的窗口要针对不同的消息而编...

9620
来自专栏大神带我来搬砖

在python中像java一样反射——动态实例化指定包下面所有的类

在项目中需要在python中把某个包下面所有的类都实例化一个对象,把这些对象放到一个集合中,在java中可以通过反射机制来实现,先获得这个包下面所有的Class...

44370
来自专栏海天一树

小朋友学Java(5):静态方法

先编写程序: class Demo { public void fun1() { System.out.println("Hello")...

29360
来自专栏desperate633

深入理解Java中的内存泄漏内存泄漏内存泄漏发生的原因造成内存泄露的常见情形内存泄露的解决方案

Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还...

10510
来自专栏代码世界

Python之内置函数

内置函数 python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使...

33470
来自专栏大闲人柴毛毛

三分钟理解“模板方法模式”——设计模式轻松掌握

模板方法模式的官方定义: 在模板方法模式中,只定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定...

373100
来自专栏LuckQI

学习Java基础知识,打通面试关七

9810
来自专栏栗霖积跬步之旅

1.2使用多线程

一个进程正在运行时,至少会有一个线程在运行。线程在后台默默执行,比如调用main方法的线程就是如此,它是由JVM创建的。 class Test { pu...

21060
来自专栏Python中文社区

7个提升Python程序性能的好习惯

使用局部变量替换模块名字空间中的变量,例如 ls = os.linesep。一方面可以提高程序性能,局部变量查找速度更快;另一方面可用简短标识符替代冗长的模块变...

15760
来自专栏zhangdd.com

nginx location匹配规则

~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,如果该选项匹配...

11540

扫码关注云+社区

领取腾讯云代金券