面试题答案
一键面试本质区别
exports
:在 Node.js 模块中,exports
是一个指向module.exports
的引用。它本质上是module.exports
的一个别名,初始时二者指向同一个空对象{}
。这意味着通过exports
添加的属性和方法,实际上是添加到了module.exports
所指向的对象上。module.exports
:它才是 Node.js 模块真正用于导出的对象。当 Node.js 加载一个模块时,最终导出的是module.exports
指向的对象。如果重新赋值exports
,并不会改变module.exports
的指向,因为exports
只是一个别名,重新赋值后它不再指向module.exports
原来的对象。
使用场景及理由
使用 module.exports
的场景
- 导出复杂数据结构或函数构造函数:当你需要导出一个复杂的对象,比如一个类的构造函数或者一个包含多个属性和方法且结构复杂的对象时,使用
module.exports
更为合适。因为exports
重新赋值后会切断与module.exports
的联系,而module.exports
直接赋值可以确保导出正确的对象。
// 导出一个类的构造函数
module.exports = class MyClass {
constructor() {
this.message = 'Hello from MyClass';
}
sayHello() {
console.log(this.message);
}
};
- 替换整个导出对象:如果你需要完全替换默认导出的对象,只能使用
module.exports
。例如,你要导出一个函数而不是对象字面量。
// 导出一个函数
module.exports = function () {
console.log('This is a function export');
};
使用 exports
的场景
- 简单属性和方法导出:当只是简单地向导出对象添加一些属性和方法时,使用
exports
比较方便,因为它与module.exports
初始指向相同,添加操作直接作用于module.exports
指向的对象。
// 导出简单属性和方法
exports.name = 'John';
exports.sayName = function () {
console.log('My name is'+ this.name);
};
这种情况下,由于没有重新赋值 exports
,它和 module.exports
依然保持联系,最终导出的对象包含添加的属性和方法。