[nodejs]exports和module.exports

exports和module.exports

exports代表导出对象,它是一个全局对象。经exports导出对象的属性可以用require函数引用。
如在hello

function hello(){
   console.log('hello world!');
}
//给exprots添加hello属性可讲将hello函数导出
exports.hello=hello;

test.js中使用它


//hello表示hello.js导出对象exports
var hello = require('../routes/hello.js');

//调用exports对象的hello属性并执行
hello.hello();

在node命令行执行 node test.js输出hello world!

声明和导入,这样看起来很完美了,那module.exports是干什么的?原因就在使用exprots导出必须为其添加属性而不能重写exports对象。比如上例我只导出一个函数,直接重写exports对象是不允许的。

exports=hello; //错误,这样写不会正确导出

正因这样,就需要使用到module.exports,它可以导出单个对象。用module.exports导出上例的对象:

//hello.js
function hello(){
   console.log('hello world!');
}
module.exports= hello;
//test.js
var hello = require('../routes/hello.js');
hello();

深入exports和module.exports

那我们深入一下,exports和module.exports究竟什么关系。

exports其实是module.exports的一个全局引用。可以把前者当作后者的一个简写。对exports添加属性也相当于对module.exports添加属性(因为它们引用相同,指向同一地方),而当我们对exports重新赋值后,exports将不再指向module.exports。

下面例子演示了这个过程:

//原对象,模拟module.exports
var source = {
    a1:12,  
};

//复制对象,模拟exports,其保留对source对象引用
var copy = source;

//添加一个对象,两对象输出结果一致
copy.b2 = 23;
console.log(source); //{ a1: 12, b2: 23 }
console.log(copy);  //{ a1: 12, b2: 23 }

//改变copy对象引用,两对象结果不一致
copy = 34;
console.log(source); //{ a1: 12, b2: 23 }
console.log(copy);  //34

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值