<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://pic1.liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://pic1.liuxinxiu.com:80/node_exports/</link>
<title><![CDATA[nodejs中exports与module.exports的区别]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Sun, 04 Sep 2016 05:17:49 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/node_exports/</guid> 
<description>
<![CDATA[ 
	<p><font face="微软雅黑, Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 15px; line-height: 27px;">你肯定非常熟悉nodejs模块中的exports对象，你可以用它创建你的模块。例如：（假设这是rocker.js文件）</span></font></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>exports.name&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'My&nbsp;name&nbsp;is&nbsp;Lemmy&nbsp;Kilmister'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li></ol></div><p>在另一个文件中你这样引用</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;rocker&nbsp;=&nbsp;require(</span><span class="string">'./rocker.js'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>rocker.name();&nbsp;<span class="comment">//&nbsp;'My&nbsp;name&nbsp;is&nbsp;Lemmy&nbsp;Kilmister'</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>那到底Module.exports是什么呢？它是否合法呢？</p><p>其实，Module.exports才是真正的接口，exports只不过是它的一个辅助工具。　最终返回给调用的是Module.exports而不是exports。</p><p>所有的exports收集到的属性和方法，都赋值给了Module.exports。当然，这有个前提，就是Module.exports本身不具备任何属性和方法。如果，Module.exports已经具备一些属性和方法，那么exports收集来的信息将被忽略。</p><p>修改rocker.js如下：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>module.exports&nbsp;=&nbsp;</span><span class="string">'ROCK&nbsp;IT!'</span><span>;&nbsp;&nbsp;</span></span></li><li><span>exports.name&nbsp;=&nbsp;<span class="keyword">function</span><span>()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'My&nbsp;name&nbsp;is&nbsp;Lemmy&nbsp;Kilmister'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&#125;;&nbsp;&nbsp;</span></li></ol></div><p>再次引用执行rocker.js</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;rocker&nbsp;=&nbsp;require(</span><span class="string">'./rocker.js'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>rocker.name();&nbsp;<span class="comment">//&nbsp;TypeError:&nbsp;Object&nbsp;ROCK&nbsp;IT!&nbsp;has&nbsp;no&nbsp;method&nbsp;'name'</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>发现报错：对象&ldquo;ROCK IT!&rdquo;没有name方法</p><p>rocker模块忽略了exports收集的name方法，返回了一个字符串&ldquo;ROCK IT!&rdquo;。由此可知，你的模块并不一定非得返回&ldquo;实例化对象&rdquo;。你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array等等。</p><p>你的模块可以是任何你设置给它的东西。如果你没有显式的给Module.exports设置任何属性和方法，那么你的模块就是exports设置给Module.exports的属性。</p><p>下面例子中，你的模块是一个类：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>module.exports&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(name,&nbsp;age)&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.age&nbsp;=&nbsp;age;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.about&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="keyword">this</span><span>.name&nbsp;+</span><span class="string">'&nbsp;is&nbsp;'</span><span>+&nbsp;</span><span class="keyword">this</span><span>.age&nbsp;+</span><span class="string">'&nbsp;years&nbsp;old'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;</span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li></ol></div><p>可以这样应用它：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;Rocker&nbsp;=&nbsp;require(</span><span class="string">'./rocker.js'</span><span>);&nbsp;&nbsp;</span></span></li><li><span><span class="keyword">var</span><span>&nbsp;r&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Rocker(</span><span class="string">'Ozzy'</span><span>,&nbsp;62);&nbsp;&nbsp;</span></span></li><li class="alt"><span>r.about();&nbsp;<span class="comment">//&nbsp;Ozzy&nbsp;is&nbsp;62&nbsp;years&nbsp;old</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p>下面例子中，你的模块是一个数组：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>module.exports&nbsp;=&nbsp;[</span><span class="string">'Lemmy&nbsp;Kilmister'</span><span>,&nbsp;</span><span class="string">'Ozzy&nbsp;Osbourne'</span><span>,&nbsp;</span><span class="string">'Ronnie&nbsp;James&nbsp;Dio'</span><span>,&nbsp;</span><span class="string">'Steven&nbsp;Tyler'</span><span>,&nbsp;</span><span class="string">'Mick&nbsp;Jagger'</span><span>];&nbsp;&nbsp;</span></span></li></ol></div><p>可以这样应用它：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span class="keyword">var</span><span>&nbsp;rocker&nbsp;=&nbsp;require(</span><span class="string">'./rocker.js'</span><span>);&nbsp;&nbsp;</span></span></li><li><span>console.log(<span class="string">'Rockin&nbsp;in&nbsp;heaven:&nbsp;'</span><span>&nbsp;+&nbsp;rocker[2]);&nbsp;</span><span class="comment">//Rockin&nbsp;in&nbsp;heaven:&nbsp;Ronnie&nbsp;James&nbsp;Dio</span><span>&nbsp;&nbsp;</span></span></li></ol></div><p><span style="color: rgb(255, 0, 0);">现在你明白了，如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的&ldquo;实例化对象&rdquo;就用exports。</span></p><p>给Module.exports添加属性类似于给exports添加属性。例如：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>module.exports.name&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'My&nbsp;name&nbsp;is&nbsp;Lemmy&nbsp;Kilmister'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li></ol></div><p>同样，exports是这样的</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>exports.name&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(<span class="string">'My&nbsp;name&nbsp;is&nbsp;Lemmy&nbsp;Kilmister'</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;;&nbsp;&nbsp;</span></li></ol></div><p>请注意，这两种结果并不想同。前面已经提到module.exports是真正的接口，exports只不过是它的辅助工具。推荐使用exports导出，除非你打算从原来的&ldquo;实例化对象&rdquo;改变成一个类型。</p>
]]>
</description>
</item><item>
<link>http://pic1.liuxinxiu.com:80/node_exports/#blogcomment</link>
<title><![CDATA[[评论] nodejs中exports与module.exports的区别]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/node_exports/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>