nodejs中module.exports和exports的区别辟谣!网上好多说法都有错误

今天学习,看到妙味视频里讲module.exports和exports指向的是一个对象,区别是exports是全局的,于是就想到那不是所有模块暴露出的变量都可以在某个模块引入后被访问到了,于是自己敲代码试一试,结果并!不!是!

辟谣2点:

1.module.exports和exports指向的确实是一个对象。

2.不存在如果module.exports执行以后,所有的exports方法都将失效。

==================================================================================================================================

两个文件2.js和hello.js,后者引用前者:

requ.js的代码:

var b='re 的 b';
exports.b=b;
test.js代码:

/**
 * Created by Administrator on 2017/4/26.
 */
var exp=require('./requ');//require返回了每个module的exports对象,这个对象要接收了之后再访问!!!
                        //全局的exports对象和每个模块的module.exports
                        //你在这个模块里写exports和module..exports都是当前这个模块的exports
                        //是用来给别的模块暴露数据的exports,而不是接收来的。
console.log(exports.b);//undefined //当前模块的还没加入b属性,在当前对象中的exports不是你接收来的哇
console.log(exp.b);//2 de b //这个exp是从2.js接收来的,人家2.js暴露了不,这里当然有b
console.log("=======测试module.exports和exports是否指向同一个对象========");
module.exports.age=[1,2,3];
console.log(exports);//输出:{ age: [ 1, 2, 3 ] }  //可见就是指向同一个
console.log("=======测试module.exports先执行后,exports是否还有效========");
module.exports.name=[1,2,3];
exports.name=[1,2,3,4];
console.log(module.exports.name);//[ 1, 2, 3, 4 ]
console.log(exports.name);//[ 1, 2, 3, 4 ]
                          //exports在module.exports之后修改属性有效。
输出结果:

"D:\WebStorm 9.0.3\bin\runnerw.exe" "C:\Program Files (x86)\nodejs\node.exe" hello.js
undefined
2 的 b
=======测试module.exports和exports是否指向同一个对象========
{ age: [ 1, 2, 3 ] }
=======测试module.exports先执行后,exports是否还有效========
[ 1, 2, 3, 4 ]
[ 1, 2, 3, 4 ]

=================================================================

下面解释辟谣2.不存在如果module.exports执行以后,所有的exports方法都将失效。

网上的代码是:

创建一个rocker.js:

  1. module.exports = 'ROCK IT!';  
  2. exports.name = function() {  
  3.     console.log('My name is Lemmy Kilmister');  
  4. };  
创建另外一个文件,并且执行:
[javascript]  view plain  copy
  1. var rocker = require('./rocker.js');  
  2. rocker.name(); // TypeError: Object ROCK IT! has no method 'name'  
大哥,您这是手动断开了 module.exports的指向好吗,不是module.exports执行以后,所有的exports方法都将失效。

第一个代码中的

  1. module.exports = 'ROCK IT!';   //module.exports本来好好的指向初始化的(堆中的)对象,这句话应经把它的指向变成了(变量对象中的)字符串。
  2.    //这个时候的module.exports和exports指向已经不同了啊,谈什么有效没效。
  3.   //这是强行断开了本该同样的引用

===================================================================================================================================

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports
总之:记住require()返回的是module.exports就好了。

exports再怎么变,也是因为指向和module.exports相同的对象,所以改变了module.exports的值(从这个意义上来说,网上有些说exports是“辅助”,也是有点道理的)

你可能感兴趣的:(nodejs中module.exports和exports的区别辟谣!网上好多说法都有错误)