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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 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导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
jquery text()要注意啦
2009/10/30 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
vue实现选中效果
2020/10/07 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python断言assert的用法代码解析
2018/02/03 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
畜牧兽医本科生的自我评价
2014/03/03 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
2014年党务工作总结
2014/11/25 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers