Nodejs中exports与module.exports的区别

来源:互联网 发布:书慧淘宝培训 编辑:程序博客网 时间:2024/05/01 14:06

下面先来看个例子:

var a = {    name : 'a',    fun : function(){        console.log(this.name);    }};var  b = a;a.fun();b.fun();//输出a ab.name = 'b';a.fun();b.fun();//输出b bb = {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方法。



0 0
原创粉丝点击