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

来源:互联网 发布:多益网络手机游戏 编辑:程序博客网 时间:2024/05/01 05:59

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

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

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