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的url截取模块url-extract的使用实例
Nov 18 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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强制运行广告的方法
2014/12/01 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
php自动加载代码实例详解
2021/02/26 PHP
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
JavaScript如何判断input数据类型
2020/02/06 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
Python读写ini文件的方法
2015/05/28 Python
Python实现简单字典树的方法
2016/04/29 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
python中常见错误及解决方法
2020/06/21 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
介绍下static、final、abstract区别
2015/01/30 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
花坛标语大全
2014/06/30 职场文书
秋季运动会加油词
2015/07/18 职场文书
创业计划书介绍
2019/04/24 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS