nodejs 中module.exports 和 exports 区别详细介绍

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块接下来介绍创建过程,感兴趣的朋友可以参考下

你肯定非常熟悉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导出,除非你打算从原来的“实例化对象”改变成一个类型。

您可能感兴趣的文章:

时间: 2024-11-05 07:17:38

nodejs 中module.exports 和 exports 区别详细介绍的相关文章

[转载]C++中引用与指针的区别(详细介绍)

本文转载自http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引

C++中引用与指针的区别(详细介绍)

指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名.     ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化

nodejs(第三篇):nodejs中的文件模块、nodejs中的require与exports、http模块补充、JavaScript Standard Style

一.nodejs中的文件模块 在nodejs中,用户自己编写的模块,称为文件模块. 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/.../.../xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/.../.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹加载. (1)在Node.js中,require是一个方法,只有通过requir

Linux中的lo回环接口详细介绍

1.linux的网络接口之扫盲 (1)网络接口的命名 这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的.例如: eth0: ethernet的简写,一般用于以太网接口. wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口. ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口. lo: local的简写,一般指本地环回接口. (2)网络接口如何工作 网络接口是用来发送和接受数据包的基本设备. 系统中的所有网络接口组成一个链状结构,应用层

C++中overload,override,overwrite的区别详细解析

以下是对C++中overload,override,overwrite的区别进行了详细的分析介绍,需要的朋友可以过来参考下 Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载.(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同

systemverilog中module与program的区别

我们知道,verilog语法标准中是没有program的,program是systemverilog语法标准新增的内容. 那么,为什么要新增一个program呢?主要考量是基于电路的竞争与冒险. 为避免仿真和设计竞争问题(race condition),systemverilog中引入了program的概念. 所有与设计相关的线程在module中执行,而与验证有关的线程则在program中运行.在仿真过程中,这两种线程运行在不同的时间步(time step),从而解决了竞争问题. module与

PHP中 post 与get的区别 详细说明

1.Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.jincaib.com/index.php, 数据都会直接显示在 url 上,就像用户点击一个链接一样:Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将

mysql中int、bigint、smallint 和 tinyint的区别详细介绍

bigint 20位数字 8个字节从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. 9223372036854775808P.S. bigint已经有长度了,在mysql建表中的length,只是用于显示的位数 int 11位数字 4个字节从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字).存储大小

在C和C++中struct与typedef struct的区别详细介绍

c中测试code struct Cmstruct { int c; } Cm; // Cm是一个变量 typedef struct MyStruct //这里的 Mystruct 可以省略 { int m; } My; // My 是struct MyStruct 别名 My st; struct Cmstruct cm1; // 只能使用struct Cmstruct来定义 不能使用Cmstruct st.m = 1; printf("%d\n", st.m); // 1 // st