Node.js中module.exports与exports的区别
2015-10-13 13:46
375 查看
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
Node.js为了方便地导出功能函数,node.js会自动地实现以下这个语句
foo.js
test.js
看到这里,相信大家都看到答案了,exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。
再看看下面例子
foo.js
结果:2
exports在module.exports 被改变后,失效。
是不是开始有点廓然开朗,下面将会列出开源模块中,经常看到的几个使用方式。
##module.exports = View
javascript里面有一句话,函数即对象,View 是对象,module.export =View, 即相当于导出整个view对象。外面模块调用它的时候,能够调用View的所有方法。不过需要注意,只有是View的静态方法的时候,才能够被调用,prototype创建的方法,则属于View的私有方法。
foo.js
module.exports = View
test.js
##var app = exports =module.exports = {};
其实,当我们了解到原理后,不难明白这样的写法有点冗余,其实是为了保证,模块的初始化环境是干净的。同时也方便我们,即使改变了 module.exports 指向的对象后,依然能沿用 exports的特性
例子,当中
= module.exports的方法,让其恢复原来的特点。
##exports.init= function(){}
这种最简单,直接就是导出模块 init的方法。
##var mongoose = module.exports = exports = new Mongoose;
集多功能一身,不过根据上文所描述的,大家应该不能得出答案。
你的模块可以是任何你设置给它的东西。如果你没有显式的给
下面例子中,你的模块是一个类:
![](http://common.cnblogs.com/images/copycode.gif)
![](http://common.cnblogs.com/images/copycode.gif)
可以这样应用它:
下面例子中,你的模块是一个数组:
可以这样应用它:
现在你明白了,如果你想你的模块是一个特定的类型就用
给Module.exports添加属性类似于给exports添加属性。例如:
同样,exports是这样的
请注意,这两种结果并不想同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的“实例化对象”改变成一个类型
module.exports = {};
Node.js为了方便地导出功能函数,node.js会自动地实现以下这个语句
foo.js
exports.a = function(){ console.log('a') } exports.a = 1
test.js
var x = require('./foo'); console.log(x.a)这里控制台输出:1。如果注释掉exports.a = 1, 那么输出[Function]
看到这里,相信大家都看到答案了,exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。
再看看下面例子
foo.js
exports.a = function(){ console.log('a') } module.exports = {a: 2} exports.a = 1test.js
var x = require('./foo'); console.log(x.a)
结果:2
exports在module.exports 被改变后,失效。
是不是开始有点廓然开朗,下面将会列出开源模块中,经常看到的几个使用方式。
##module.exports = View
function View(name, options) { options = options || {}; this.name = name; this.root = options.root; var engines = options.engines; this.defaultEngine = options.defaultEngine; var ext = this.ext = extname(name); if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); this.path = this.lookup(name); } module.exports = View;
javascript里面有一句话,函数即对象,View 是对象,module.export =View, 即相当于导出整个view对象。外面模块调用它的时候,能够调用View的所有方法。不过需要注意,只有是View的静态方法的时候,才能够被调用,prototype创建的方法,则属于View的私有方法。
foo.js
function View(){ } View.prototype.test = function(){ console.log('test') } View.test1 = function(){ console.log('test1') } module.exports = View test.js var x = require('./foo'); console.log(x) //{ [Function: View] test1: [Function] } console.log(x.test) //undefined console.log(x.test1) //[Function] x.test1() //test1
module.exports = View
test.js
var x = require('./foo'); console.log(x) //{ [Function: View] test1: [Function] } console.log(x.test) //undefined console.log(x.test1) //[Function] x.test1() //test1
##var app = exports =module.exports = {};
其实,当我们了解到原理后,不难明白这样的写法有点冗余,其实是为了保证,模块的初始化环境是干净的。同时也方便我们,即使改变了 module.exports 指向的对象后,依然能沿用 exports的特性
例子,当中
module.exports = createApplication改变了module.exports了,让exports失效,通过exports
= module.exports的方法,让其恢复原来的特点。
##exports.init= function(){}
这种最简单,直接就是导出模块 init的方法。
##var mongoose = module.exports = exports = new Mongoose;
集多功能一身,不过根据上文所描述的,大家应该不能得出答案。
你的模块可以是任何你设置给它的东西。如果你没有显式的给
Module.exports设置任何属性和方法,那么你的模块就是exports设置给
Module.exports的
属性。
下面例子中,你的模块是一个类:
![](http://common.cnblogs.com/images/copycode.gif)
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; };
![](http://common.cnblogs.com/images/copycode.gif)
可以这样应用它:
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以及配置npm
- monodevelop常用默认快捷键
- Node是什么
- nodejs win7 安装失败
- 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0
- 浅谈Nodejs观察者模式
- 浅谈Nodejs观察者模式
- LeetCode:Delete Node in a Linked List
- Swap Nodes in Pairs
- nodejs API之QueryString
- nodejs API之URL
- [LeetCode]题解(python):025-Reverse Nodes in k-Group
- [LeetCode]题解(python):024-Swap Nodes in Pairs
- Leetcode92: Swap Nodes in Pairs
- leetcode Populating Next Right Pointers in Each Node
- lintcode 容易题:Insert Node in a Binary Search Tree 在二叉查找树中插入节点
- node.js安装和使用步骤-windows
- Remove Nth Node From End of List
- 自制工具:迅速打开一个Node 环境的Playground
- lintcode 容易题:Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点