要理解這兩個之間的區(qū)別確實對于剛接觸Nodejs的小伙伴來說比較的難理解,去外面面試nodejs崗位的時候一般在筆試題里也會有問到exports 和 module.exports 的區(qū)別,那怎么才能更好的理解這兩者之間的區(qū)別,我也網(wǎng)上翻看了一下一些技術(shù)大牛自己的解釋,然后綜合了一下,自己也不斷的測試之后也有了一點自己的理解。
寫的比較詳細的是nswbmw寫的
https://cnodejs.org/topic/5231a630101e574521e45ef8
他把兩者之間的區(qū)別歸結(jié)為了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";
這樣調(diào)用的時候
var utils = require("./utils.js");
console.log(utils.name);
utils.name其實就是對module.exports.name的調(diào)用,只是因為exports.name修改了內(nèi)容中的值,所以module.exports.name的值也發(fā)生了變化
再來看一個例子
exports.name = "2";
這時,因為沒有初始化module.exports,所以module.exports是一個空的對象{},exports也是一個空的對象,所以直接賦值之后其實就是給module.exports對象賦值了,所以utils.name其實調(diào)用的還是module.exports.name
再來看一個例子
exports = function(){
console.log("hello");
}
var utils = require("./utils.js");
utils();
這時,服務(wù)器會報錯,提示utils不是一個有效的功能函數(shù),這就是因為require() 返回的是 module.exports 而不是 export是空的,只要把utils改成
module.exports = function(){
console.log("hello");
}
就對了,那如果要用exports,可以直接給exports對象定義一個function
exports.sayHello = function(){
console.log("hello");
}
然后通過function來調(diào)用
var utils = require("./utils.js");
utils.sayHello();
最后再來看一個例子,把對象直接賦給module.exports,這樣就可以直接通過new一個對象來調(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();