要理解这两个之间的区别确实对于刚接触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();