node.js中module.exports与exports

区别

Module.exports才是真正的接口,exports只不过是它的一个辅助工具。简单的来说exports 用于挂属性(常量或者属性)上去到module 最终返回给调用的是Module.exports而不是exports。

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

//在1.js
exports.money=50
exports.sayHi= function() {
    console.log('Hi,I am dream_wk');
};



//在2.js
var wk= require('./rocker.js');
wk.sayHi(); //Hi,I am dream_wk
consoloe.log(wk.money)//50

从上面就可以看出exports其实就是挂属性在对象上,在require进文件后,我们可以在其他文件直接使用该对象的属性

//错误示范
//在1.js
module.exports = '错误示范';
exports.money=50
exports.sayHi= function() {
    console.log('Hi,I am dream_wk');
};

//在2.js
var wk= require('./1.js');
consoloe.log(wk)
wk.sayHi(); 
consoloe.log(wk.money)//50
//上面会输出  错误示范  四个字
//然后报错

总结

1.exports是module.exports的一个引用

2.require引用模块后,返回给调用者的是module.exports而不是exports

3.exports.xxx,相当于在导出对象上挂属性,该属性对调用模块直接可见

4.exports =相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性(下面代码就是例子)

5.如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例

//
//在1.js
exports = "123"
exports.money=50
exports.sayHi= function() {
    console.log('Hi,I am dream_wk');
};

//在2.js
var wk= require('./1.js');
consoloe.log(wk)
wk.sayHi(); 
consoloe.log(wk.money)
//上面会输出 空对象{} 因为在1.js 里面对exports进行了重新定义  所以在2.js文件中require时 并不是将新定义的exports引进去   他还是引进了module  也就是说在1.js中的exports = "123" 使得exports不再是module的一个引用了(也就不可通过exports.money=50去挂载属性在要导出的对象module上 了)

建议

对于要导出的属性,可以简单直接挂到exports对象上 或者也可以像下面这样

//1.js中
module.exports = {
   name:"dream_wk",
   sayHi(){
   console.log("HI")}
};

//2.js中
var wk= require('./1.js');
consoloe.log(wk.name);
wk.sayHi()

对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new操作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起
在这里插入图片描述

原创文章 8 获赞 11 访问量 6153

猜你喜欢

转载自blog.csdn.net/weixin_40642141/article/details/106105834
今日推荐