nodeJs中exports和module.exports的区别

来源:互联网 发布:excel解密软件下载 编辑:程序博客网 时间:2024/06/08 06:21

exports作用主要是导出共有的对象供其它模块来调用,在这一点上二者作用是类似的。

其实,准确意义上来讲,exports是Module.exports的辅助用法,通过下面的例子进行说明,部分代码是copy过来的。

exports.sayHello = function() {    console.log('Hello, world ');};

将上面的js文件保存起来,比如叫做hello.js

然后在其它的地方就可以引用这个hello.js中的函数name了,这里hello.js就已经扮演着模块的作用。

var hello = require('./hello.js');hello.sayHello(); //Hello, world


exports所做的事情是收集属性,exports只是module.exports的辅助方法。你的模块最终返回module.exports给调用者,而不是exports。如果module.exports当前没有任何属性的话,exports会把这些属性赋予module.exports。如果module.exports已经存在一些属性的话,那么exports中所用的东西都会被忽略。

还是上面的例子,如果在hello.js中新增如下内容,还是按照之前的方式调用:

module.exports = "welcome";exports.sayHello = function() {    console.log('Hello, world ');};
调用hello.js这个模块:

var hello = require('./hello.js');hello.sayHello(); //此时会报错,没有sayHello这个方法。

模块可以是任何合法的JavaScript对象 - boolean,number,date,JSON, string,function,array和其他。你的模块可以是任何你赋予module.exports的值。如果你没有明确的给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;如果你希望你的模块成为一个传统的模块实例(module instance),使用exports。

把属性赋予module.exports的结果与把属性赋予给exports是一样的。看下面这个例子:

module.exports.name = function() {    console.log('My name is Lemmy Kilmister');};

下面的用法:

exports.name = function() {    console.log('My name is Lemmy Kilmister');};
二者的效果是一样的,但是二者是不同的东西,module.exports是真实存在的东西,exports只是它的辅助方法。话虽如此,exports还是推荐的对象,除非你想把你模块 的对象类型从传统的模块实例(module instance)修改为其他的。






0 0