Rumah > Soal Jawab > teks badan
nodejs 中经常会看到这样的代码
exports = module.exports = {}
请问 为什么要让 exports = module.exports 呢? 这样做有什么作用呢? 谢谢!!!
PHPz2017-04-17 15:32:40
让这个模块更加纯粹的写法。
module.exports是require()方法调用模块的接口,而exports可以给模块添加更多的方法,而exports返回的是一个实例化对象,指向module.exports
比如对于一个构造函数来说:
Person.js
var Person = function() {
this.name = 'Samuel';
}
//通过module.exports
module.exports = Person;//这里将Person作为模块暴露的接口,传递给require(),使其返回这个Person
exports.one = 'Shervesi';//这里给Person添加了一个属性,那么通过require()返回的模块也会拥有这个方法
Use.js
var P = require('./Person');
console.log(P.name);//'Samuel'
console.log(P.one);//'Shervesi',这个属性是Person所不具有的
因此可以将exports理解为给模块进行最后修饰的方法;
而module.exports则负责暴露一个接口供require()方法调用,若module.exports没有被声明指向,那它就默认的导出exports所指向的对象,如这样一个场景:
Person.js
var Person = function() {
this.name = 'Samuel';
}
module.exports = 'I am a string';//module.exports被声明指向了一个字符串
exports.one = 'Shervesi';
User.js
var P = require('./Person.js');
console.log(P);//'I am a string' //这是module.exports所提供的接口指向的
console.log(P.one);//这里会出现类型错误,因为负责暴露接口的module.exports已经导出了一个字符串,即是一个常量,因此不能携带one属性,exports所修饰的one属性被‘干掉’。
总结:
module.exports是模块导出的仲裁,它决定到底导出一个什么东西,本质上就是提供给require()方法的一个返回值,因此它可以是任何js基本类型(包括null);
exports是给导出模块进行修饰的辅助方法,但受module.exports的仲裁,决定模块是否能具有这个属性。