细说exports和module.exports

来源:互联网 发布:局域网共享端口开启 编辑:程序博客网 时间:2024/06/05 19:27

细说一:

exports和module.exports的作用都是把文件模块里的方法和属性暴露给require返回的对象(模块对象)进行调用。但是,两者之间存在着本质区别,exports的属性和方法都可以被module.exports替代。例如下面代码:

export.myName = 'Pandora_Galen'; 和 module.exports.myName = 'Pandora_Galen';  // 作用是一样的

但是,exports不能替代module.exports方法,可以被理解为包含关系。

所有的exports对象最终都是通过module.exports传递执行的。因此,可以说exports是给module.exports添加属性和方法(我有时在想,exports可不可以被看做是对module.exports的一个引用)。下面的代码是用来验证我们在这里的说法的:

exports.name = 'a';  // 暴露name属性exports.happy = function () {  // 暴露happy方法    console.log('mm');};console.log( module.exports );  // 打印module.exports对象

执行后输出:

{ name: 'a', happy: [Function] }

从结果上看module.exports相当于require所返回的对象。也就是说所有require返回的对象实质上和module.exports对象是相同的。


细说二

module.exports方法还可以单独返回一个数据类型,而exports返回的只能是一个对象。

所以,当我们需要返回一个数组、字符串、数字等类型时,就必须使用module.exports了。


细说三:

当使用了module.exports关键词以后,该模块中的所有exports对象执行的属性和方法都将被忽略。例如下面代码片段test.js(文件模块名):

module.exports = ' test for module.exports ignore! '; // 返回一个字符串exports.name = 'Galen';/* 定义getName函数,并暴露给外部接口 */exports.getName = function() {    console.log('My name is Galen');};console.log( module.exports );  // 打印module.exports对象

创建执行上面文件模块的执行文件app.js , 代码如下:

var Book = require('./test.js');console.log( Book );console.log( Book.name );console.log( Book.getName() );

运行app.jswen文件,执行结果如下:

test for modules.exports ignore!  // 由打印console.log( module.exports)而来test for modules.exports ignore! // 由打印console.log( Book )而来undefined  // 由打印console.log( Book.name )而来
1 0
原创粉丝点击