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 win7下安装方法
May 24 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
nodeJS微信分享
Dec 20 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
Python的Django框架安装全攻略
2015/07/15 Python
Python列表切片操作实例总结
2019/02/19 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Python程序慢的重要原因
2020/09/04 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
大三学习计划书范文
2014/05/02 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
经理岗位职责
2015/02/02 职场文书
综合测评自我评价
2015/03/06 职场文书
网络舆情信息简报
2015/07/21 职场文书
安全生产培训心得体会
2016/01/18 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
Minikube搭建Kubernetes集群
2022/03/31 Servers
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers