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 文本操作模块-fs模块(二)
Dec 22 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
监控Nodejs的性能实例代码
Jul 02 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 array_walk() 数组函数
2011/07/12 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Python模拟百度登录实例详解
2016/01/20 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
详解python的四种内置数据结构
2019/03/19 Python
Python数据可视化图实现过程详解
2020/06/12 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
企业员工培训感言
2014/02/26 职场文书
满月酒主持词
2014/03/27 职场文书
师范生见习报告范文
2014/11/03 职场文书
2014财务年度工作总结
2014/11/11 职场文书
预备党员党支部意见
2015/06/02 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL