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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python书籍信息爬虫实例
2018/03/19 Python
python实现PID算法及测试的例子
2019/08/08 Python
python 类之间的参数传递方式
2019/12/20 Python
详解Python中的分支和循环结构
2020/02/11 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
旅游管理专业大学生职业规划书
2014/02/27 职场文书
共产党员承诺书
2014/03/25 职场文书
合作意向书范本
2014/03/31 职场文书
交通事故协议书范文
2014/10/23 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
员工年终考核评语
2014/12/31 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
《落花生》教学反思
2016/02/16 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏