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


Posted in NodeJs onJanuary 14, 2013

你肯定非常熟悉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导出,除非你打算从原来的“实例化对象”改变成一个类型。
NodeJs 相关文章推荐
nodejs之请求路由概述
Jul 05 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 #NodeJs
windows系统下简单nodejs安装及环境配置
Jan 08 #NodeJs
NodeJs中的非阻塞方法介绍
Jun 05 #NodeJs
nodejs win7下安装方法
May 24 #NodeJs
NodeJS的模块写法入门(实例代码)
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
You might like
PHP ajax 分页类代码
2008/11/13 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
python多线程编程中的join函数使用心得
2014/09/02 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Python绘图实现显示中文
2019/12/04 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
Ibatis如何使用动态表名
2015/07/12 面试题
人力资源专员自我评价怎么写
2013/09/19 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
班主任寄语大全
2014/04/04 职场文书
大学生就业求职信
2014/06/12 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
应届生简历自我评价
2015/03/11 职场文书
行为习惯主题班会
2015/08/14 职场文书
篮球拉拉队口号
2015/12/25 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书