nodejs中exports与module.exports的区别详细介绍

nodejs中exports与module.exports的区别详细介绍

作者: 字体:[增加 减小] 类型:转载 时间:2013-01-14 我要评论

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下
id="cproIframe_u2261530_2" width="680" height="200" src="http://pos.baidu.com/acom?adn=3&adp=1&at=0&aurl=&c01=1&cad=1&ccd=24&cec=GBK&cfv=0&ch=0&col=zh-CN&conBW=1&conOP=1&cpa=1&cpro_lu=1%2C%23dfe4f9%2C%23000000%2C%E5%AE%8B%E4%BD%93&dai=2&dis=0&layout_filter=image&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D5LtHJqTvOxCdWGsiSH_V1xFpxsgr0rLclBnrFczTn666pE3NF6FZ1HnmFqxCJZsc%26wd%3D%26eqid%3Dccd3a5990012420600000005566e29ad&ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F33269.htm&lu_161=0&lunum=6&n=jb51_cpr&pat=6&pcs=968x454&pih=0&pis=10000x10000&piw=0&ps=514x5&psr=1366x768&pss=1000x520&ptbg=90&ptp=0&ptt=0&qn=75a395e46064ce92&rad=&rsi0=680&rsi1=200&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%23000000&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=tabcloud_skin_5&stid=5&td_id=2261530&titFF=%25E5%25BE%25AE%25E8%25BD%25AF%25E9%259B%2585%25E9%25BB%2591&titFS=14&titSU=0&titTA=left&tn=baiduCustNativeAD&tpr=1450060199338&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u2261530&ti=nodejs%E4%B8%ADexports%E4%B8%8Emodule.exports%E7%9A%84%E5%8C%BA%E5%88%AB%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D_%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&tt=1450060199325.211.294.294" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="display: block;">
你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件) 
复制代码代码如下:

exports.name = function() { 
console.log('My name is Lemmy Kilmister'); 
}; 

在另一个文件中你这样引用 
复制代码代码如下:

var rocker = require('./rocker.js'); 
rocker.name(); // 'My name is Lemmy Kilmister' 

那到底Module.exports是什么呢?它是否合法呢? 
其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports。

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

修改rocker.js如下: 
复制代码代码如下:

module.exports = 'ROCK IT!'; 
exports.name = function() { 
console.log('My name is Lemmy Kilmister'); 
}; 

再次引用执行rocker.js 
复制代码代码如下:

var rocker = require('./rocker.js'); 
rocker.name(); // TypeError: Object ROCK IT! has no method 'name' 

发现报错:对象“ROCK IT!”没有name方法 
rocker模块忽略了exports收集的name方法,返回了一个字符串“ROCK IT!”。由此可知,你的模块并不一定非得返回“实例化对象”。你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array等等。

你的模块可以是任何你设置给它的东西。如果你没有显式的给Module.exports设置任何属性和方法,那么你的模块就是exports设置给Module.exports的属性。

下面例子中,你的模块是一个类: 
复制代码代码如下:

module.exports = function(name, age) { 
this.name = name; 
this.age = age; 
this.about = function() { 
console.log(this.name +' is '+ this.age +' years old'); 
}; 
}; 

可以这样应用它: 
复制代码代码如下:

var Rocker = require('./rocker.js'); 
var r = new Rocker('Ozzy', 62); 
r.about(); // Ozzy is 62 years old 

下面例子中,你的模块是一个数组: 
复制代码代码如下:

module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger']; 

可以这样应用它: 
复制代码代码如下:

var rocker = require('./rocker.js'); 
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio 

现在你明白了,如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。

给Module.exports添加属性类似于给exports添加属性。例如: 
复制代码代码如下:

module.exports.name = function() { 
console.log('My name is Lemmy Kilmister'); 
}; 

同样,exports是这样的 
复制代码代码如下:

exports.name = function() { 
console.log('My name is Lemmy Kilmister'); 
}; 

请注意,这两种结果并不想同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的“实例化对象”改变成一个类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值