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使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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
我的论坛源代码(五)
2006/10/09 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP实现的简单缓存类
2015/07/29 PHP
Yii实现简单分页的方法
2016/04/29 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
删除条目时弹出的确认对话框
2014/06/05 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
python实现小世界网络生成
2019/11/21 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
全球在线商店:BerryLook
2019/04/14 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
广告学专业应届生求职信
2013/10/01 职场文书
高三毕业寄语
2014/04/10 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
大一新生检讨书
2014/10/29 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
行政介绍信范文
2015/05/04 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
java版 联机五子棋游戏
2022/05/04 Java/Android