一、官方解释
module.exports对象是由模块系统创建的。 有时这是难以接受的;许多人希望他们的模块成为某个类的实例。 为了实现这个,需要将期望导出的对象赋值给module.exports。 注意,将期望的对象赋值给exports会简单地重新绑定到本地exports变量上,这可能不是你想要的。
exports
require
从require导入方式去理解,关键有两个变量(全局变量module.exports
,局部变量exports
)、一个返回值(module.exports
)
二、Demo事例
事例一:1.js
从事例一中,可以看出来
1.每个js文件一创建,都有一个var exports = module.exports = {};
,使exports
和module.exports
都指向一个空对象。
2.module
是全局内置对象,exports
是被var
创建的局部对象。
3.module.exports
和exports
所指向的内存地址相同
事例二:2.js、3.js
};
// 当属性在module.exports没有定义,函数在module.exports有定义
console.log(a.id2); // undefined
console.log(a.func()); // module.exports的函数
// 当函数在module.exports没有定义,属性在module.exports有定义
console.log(a.id); // module.exports的id
console.log(a.func2()); // 报错了 TypeError: a.func2 is not a function
由例二可以知道:
1.module.exports
像是exports
的大哥,当module.exports
以{}
整体导出时会覆盖exports
的属性和方法,
2.注意,若只是将属性/方法挂载在module.exports./exports.
上时,exports.id=1
和module.exports.id=100
,module.exports.id=function(){}
和exports.id=function(){}
,最后id的值取决于exports.id
和module.exports.id
的顺序,谁在后,就是最后的值
3.若exports
和module.exports
同时赋值时,exports
所使用的属性和方法必须出现在module.exports
,若属性没有在module.exports
中定义的话,出现undefined
,若方法没有在module.exports
中定义,会抛出TypeError
错误。
例三 4.js、5.js
module.exports
的对象、prototype
、构造函数使用
// 返回类
module.exports = Person;
// 若构造函数没有传入参数(name,age),直接传入对象
// module.exports = new Person('kylin',20);
说了这么多,其实建议就是,如果只是单一属性或方法的话,就使用exports.
属性/方法。要是导出多个属性或方法或使用对象构造方法,结合prototype
等,就建议使用module.exports = {}
。文章有很多地方描述的可能不是很准确,提到的点也不够全面,如果有不对的地方,还望斧正!