Nodejs中exports与module.exports的区别

下面先来看个例子:

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.js中的exports = Print注释掉的时候,输出:

{ log: [Function: log] }
Hello World!

将log.js中的module.exports = Print;注释掉的时候,输出:

{}
TypeError: p.log is not a function


由上例可以充分说明require()返回的是 module.exports 而不是exports,当exports被赋值为一个新的对象时,它将会断开与module.exports的关系,所以当require然后得到返回值为空,且不包含log方法。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值