要理解這兩個(gè)之間的區(qū)別確實(shí)對(duì)于剛接觸Nodejs的小伙伴來(lái)說(shuō)比較的難理解渔期,去外面面試nodejs崗位的時(shí)候一般在筆試題里也會(huì)有問(wèn)到exports 和 module.exports 的區(qū)別,那怎么才能更好的理解這兩者之間的區(qū)別,我也網(wǎng)上翻看了一下一些技術(shù)大牛自己的解釋粒梦,然后綜合了一下土童,自己也不斷的測(cè)試之后也有了一點(diǎn)自己的理解。
寫的比較詳細(xì)的是nswbmw寫的
https://cnodejs.org/topic/5231a630101e574521e45ef8
他把兩者之間的區(qū)別歸結(jié)為了3點(diǎn)
1.exports 是指向的 module.exports 的引用
2.module.exports 初始值為一個(gè)空對(duì)象 {}弯屈,所以 exports 初始值也是 {}
3.require() 返回的是 module.exports 而不是 exports
那怎么樣來(lái)理解呢
比如A是一個(gè)對(duì)象蜗帜,把A賦給B,B就是對(duì)A的引用资厉,即A和B指向同一個(gè)地址厅缺,如果修改了B,那么A也會(huì)修改宴偿,所以exports 是指向的 module.exports 的引用
utils.js
module.exports.name = "1";
exports.name = module.exports.name;
exports.name = "2";
這樣調(diào)用的時(shí)候
var utils = require("./utils.js");
console.log(utils.name);
utils.name其實(shí)就是對(duì)module.exports.name的調(diào)用湘捎,只是因?yàn)閑xports.name修改了內(nèi)容中的值,所以module.exports.name的值也發(fā)生了變化
再來(lái)看一個(gè)例子
exports.name = "2";
這時(shí)窄刘,因?yàn)闆](méi)有初始化module.exports窥妇,所以module.exports是一個(gè)空的對(duì)象{},exports也是一個(gè)空的對(duì)象娩践,所以直接賦值之后其實(shí)就是給module.exports對(duì)象賦值了活翩,所以u(píng)tils.name其實(shí)調(diào)用的還是module.exports.name
再來(lái)看一個(gè)例子
exports = function(){
console.log("hello");
}
var utils = require("./utils.js");
utils();
這時(shí),服務(wù)器會(huì)報(bào)錯(cuò)翻伺,提示utils不是一個(gè)有效的功能函數(shù)材泄,這就是因?yàn)閞equire() 返回的是 module.exports 而不是 export是空的,只要把utils改成
module.exports = function(){
console.log("hello");
}
就對(duì)了吨岭,那如果要用exports拉宗,可以直接給exports對(duì)象定義一個(gè)function
exports.sayHello = function(){
console.log("hello");
}
然后通過(guò)function來(lái)調(diào)用
var utils = require("./utils.js");
utils.sayHello();
最后再來(lái)看一個(gè)例子,把對(duì)象直接賦給module.exports,這樣就可以直接通過(guò)new一個(gè)對(duì)象來(lái)調(diào)用
A = function(){
console.log("構(gòu)造函數(shù)");
this.name = "hello";
}
A.prototype.sayHello = function(){
console.log(this.name);
}
module.exports = A;
var u = new utils();
u.sayHello();