面试题答案
一键面试区别
exports
:它是module.exports
的一个引用。在Node.js模块中,默认会创建一个空对象module.exports
,而exports
指向这个对象。直接对exports
重新赋值,会切断它与module.exports
的联系。例如:
// 初始时,exports 指向 module.exports
let exports = module.exports = {};
exports.a = function() {
return 'This is a function from exports';
};
// 此时 exports 和 module.exports 都有 a 方法
console.log(exports.a());
console.log(module.exports.a());
// 重新赋值 exports
exports = function() {
return 'New function assigned to exports';
};
// 此时 exports 是新函数,但 module.exports 仍然是原来的对象
console.log(exports());
console.log(module.exports.a());
module.exports
:它是Node.js模块真正对外暴露的对象。所有通过require
引入该模块的地方,得到的就是module.exports
这个对象。所以直接对module.exports
赋值是可以正确导出模块功能的。例如:
module.exports = function() {
return 'This is a function directly assigned to module.exports';
};
// 引入模块后可直接调用此函数
let myModule = require('./module');
console.log(myModule());
正确使用方式
- 使用
exports
:如果希望通过exports
来导出多个属性和方法,直接为exports
添加属性即可,因为它默认指向module.exports
。例如:
exports.add = function(a, b) {
return a + b;
};
exports.subtract = function(a, b) {
return a - b;
};
在另一个文件引入:
let mathOperations = require('./mathModule');
console.log(mathOperations.add(5, 3));
console.log(mathOperations.subtract(5, 3));
- 使用
module.exports
:如果要导出一个单一的函数、对象或其他类型的值,直接对module.exports
赋值。例如,导出一个类:
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
return `Hello, I'm ${this.name}`;
}
}
module.exports = Person;
在另一个文件引入:
let Person = require('./personModule');
let john = new Person('John');
console.log(john.sayHello());