您的位置:首页 > Web前端 > Node.js

Node.js中module.exports与exports的区别

2015-10-13 13:46 375 查看
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫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 = 1
test.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的
属性。


下面例子中,你的模块是一个类:



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导出,除非你打算从原来的“实例化对象”改变成一个类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: