下面先来看个例子:
var a = {
name : 'a',
fun : function(){
console.log(this.name);
}
};
var b = a;
a.fun();
b.fun();
//输出a a
b.name = 'b';
a.fun();
b.fun();
//输出b b
b = {name:'c' ,fun : function(){
console.log(this.name);
}};
a.fun();
b.fun();
//输出b c
从上面的例子可以明显知道对象a与对象b的关系,a才是真正的对象,而b只是a的引用,即当b.name的值改变会使的a.name的值也跟着改变,所以第二个才会输出b b;当吧被重新赋值的时候,会重新申请一块内存,所以b.name的值改变后不会影响到a.name的值,而module.exports就相当于是上述例子中的a,而exports就相当于是上述例子中的b,即它们之间的区别是:
1.exports只是module.exports的引用。
2.exports的生存周期是当前模块的执行时间,而module.exports生存周期则是当前程序的执行时间
3.require()返回的是 module.exports 而不是 exports
4.module.exports 初始值为一个空对象 {}
每一个Nodejs的执行文件都会自动地创建一个module对象,同时module.exports会创建一个叫exports的属性,初始值为空对象{}。exports和module.exports指向同一个内存,但require()返回的是module.exports而不是exports,比如你只是给导出一些属性,即对其指向的内存进行修改的时候,使用exports和module.exports都可以得到相同的结果;但是当你不再是对其指向的内存进行修改,而是覆盖(让其指向一个新的内存)的时侯,以下例子作为解释:
log.js
Print = {
log:function(){console.log("Hello World!")}
}
module.exports = Print;
exports = Print;
main.js
var p = require('./log');
console.log(p);
p.log();
{ log: [Function: log] }
Hello World!
而 将log.js中的module.exports = Print;注释掉的时候,输出:
{}
TypeError: p.log is not a function