细说exports和module.exports

细说一:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值