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的模块写法入门(实例代码)
Mar 07 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
node快速搭建后台的实现步骤
Feb 18 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
js 提交和设置表单的值
2008/12/19 Javascript
Javascript 中的类和闭包
2010/01/08 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
Python3爬虫关于识别点触点选验证码的实例讲解
2020/07/30 Python
管理站站长岗位职责
2013/11/27 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
公司业务员岗位职责
2014/03/18 职场文书
董事长助理工作职责
2014/06/08 职场文书
学校党员对照检查材料
2014/08/28 职场文书
2014年统计工作总结
2014/11/21 职场文书
消防演习感想
2015/08/10 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers