exports 和 module.exports 的区别

要理解这两个之间的区别确实对于刚接触Nodejs的小伙伴来说比较的难理解,去外面面试nodejs岗位的时候一般在笔试题里也会有问到exports 和 module.exports 的区别,那怎么才能更好的理解这两者之间的区别,我也网上翻看了一下一些技术大牛自己的解释,然后综合了一下,自己也不断的测试之后也有了一点自己的理解。
写的比较详细的是nswbmw写的
https://cnodejs.org/topic/5231a630101e574521e45ef8
他把两者之间的区别归结为了3点
1.exports 是指向的 module.exports 的引用
2.module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
3.require() 返回的是 module.exports 而不是 exports
那怎么样来理解呢
比如A是一个对象,把A赋给B,B就是对A的引用,即A和B指向同一个地址,如果修改了B,那么A也会修改,所以exports 是指向的 module.exports 的引用
utils.js

module.exports.name = "1";
exports.name = module.exports.name;
exports.name = "2";

这样调用的时候

var utils = require("./utils.js");
console.log(utils.name);

utils.name其实就是对module.exports.name的调用,只是因为exports.name修改了内容中的值,所以module.exports.name的值也发生了变化
再来看一个例子

exports.name = "2";

这时,因为没有初始化module.exports,所以module.exports是一个空的对象{},exports也是一个空的对象,所以直接赋值之后其实就是给module.exports对象赋值了,所以utils.name其实调用的还是module.exports.name
再来看一个例子

exports = function(){
    console.log("hello");
}
var utils = require("./utils.js");
utils();

这时,服务器会报错,提示utils不是一个有效的功能函数,这就是因为require() 返回的是 module.exports 而不是 export是空的,只要把utils改成

module.exports = function(){
    console.log("hello");
}

就对了,那如果要用exports,可以直接给exports对象定义一个function

exports.sayHello = function(){
    console.log("hello");
}

然后通过function来调用

var utils = require("./utils.js");
utils.sayHello();

最后再来看一个例子,把对象直接赋给module.exports,这样就可以直接通过new一个对象来调用

A = function(){
    console.log("构造函数");
    this.name = "hello";
}

A.prototype.sayHello = function(){
    console.log(this.name);
}

module.exports = A;
var u = new utils();
u.sayHello();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容