//修改后的2_modules_diff_exports.js源码如下
var counter = 0;
module.exports = function(){
counter += 10;
this.printNextCount = function()
{
console.log(counter);
}
}
var isEq = (exports === module.exports);
console.log(isEq);
复制代码 代码如下:
//修改后的2_modules_diff_exports_load.js文件源码如下
var Counter = require('./2_modules_diff_exports');
var counterObj = new Counter();
counterObj.printNextCount();
调用后,执行结果如上图
我在2_modules_diff_exports_load.js文件中输出了isEq的值 ( var isEq = (exports === module.exports); ),返回的false,这与用先前得到的结果不一致!
PS:不要用Counter.printNextCount();去访问,你只会得到一个错误的提示
API提供了解释
Note that exports is a reference to module.exports making it suitable for augmentation only. If you are exporting a single item such as a constructor you will want to use module.exports directly instead
exports仅仅是module.exports的一个地址引用。nodejs只会导出module.exports的指向,如果exports指向变了,那就仅仅是exports不在指向module.exports,于是不会再被导出
参考其它理解:
module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
exports和module.exports 覆盖
上面也也基本明白了exports和module.exports的关系和区别,但如果同时针对printNextCount()方法存在exports和module.exports,结果如何?
调用结果
从结果可以看出,并没有报错,表示可以这么定义,但最终module.exports覆盖了exports
虽然结果不会报错,如果这么用开发中难免会有一些问题存在,所以
1.最好别分别定义module.exports和exports
2.NodeJs开发者建议导出对象用module.exports,导出多个方法和变量用exports
其它...
API中还提供了其它的方法,就不细讲了,在上面例子的基础上自已动手一输出就知道了
module.id
返回string类型的模块标识,一般为完全解析后的文件名
module.filename
返回一个string类型的完全解析后文件名
module.loaded
返回一个bool类型,表示是否加载完成
module.parent
返回引用该模块的模块
module.children
返回该模块引用的所有模块对象的数组
您可能感兴趣的文章: