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 实现模拟form表单上传文件
Jul 14 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs微信开发之接入指南
Mar 17 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
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
php给数组赋值的实例方法
2019/09/26 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python实现自动发送邮件功能
2021/03/02 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python使用xpath实现图片爬取
2020/09/16 Python
python 实用工具状态机transitions
2020/11/21 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
Sony C++笔试题
2013/03/10 面试题
快餐店的创业计划书范文
2014/01/29 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
个人安全承诺书
2014/05/22 职场文书
校园环保标语
2014/06/13 职场文书
教师求职自荐书
2014/06/14 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
公司年夜饭通知
2015/04/25 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang