Node.js中exports与module.exports的区别

1、exports使用

test.jshtml

exports.name = function() {
    console.log('张三');
};

index.js使用数组

var test= require('./test.js');
test.name(); // '张三'

错误用法工具

exports = function() {
    console.log('张三');
};

这样至关于给exports对象从新赋值,不能导出,调用模块不能访问exports对象及其属性ui

说明this

  • exports对象实际上就是对module.exports的引用exports只是它的一个辅助工具,最终返回给调用的是Module.exports而不是exports
  • 若是你没有显式的给Module.exports设置任何属性和方法,那么你的模块就是exports设置给Module.exports的属性

2、module.exports使用

2.1 module.exports与exports使用顺序问题spa

test.js .net

module.exports = {name:'张三'};
exports.getName = function(){
  console.log('李四')
};

 index.js使用code

var test = require('./test.js');
console.log(test.name); // 输出结果 -> 张三
test.getName(); // Uncaught TypeError: test.getName is not a funtion

说明htm

  • module.exports对象不为空的时候exports对象就自动忽略,由于module.exports经过赋值方式已经和exports对象指向的变量不一样了,exports对象怎么改和module.exports对象不要紧了
  • 全部的exports收集到的属性和方法,都赋值给了Module.exports。固然,这有个前提,就是Module.exports自己不具有任何属性和方法。若是Module.exports已经具有一些属性和方法,那么exports收集来的信息将被忽略

 

2.2 使用module.exports导出一个类 对象

person.js

module.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +' is '+ this.age +' years old');
    };
};

index.js 使用

var Person = require('./person.js');
var p1 = new Test('张三', 22);
p1.about(); // 张三 is 22 years old

 

2.3 使用module.exports导出一个数组

test.js

module.exports = ['a', 'b', 'c', 'd', 'e'];

index.js 使用

var test = require('./test.js');
console.log(test[2]); // c

 

2.4 常见使用方法解释

exports = module.exports = somethings

等价于

module.exports = somethings
exports = module.exports

说明

module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 仍是指向原来的内存块,为了让 module.exports 和 exports 仍是指向同一块内存或者说指向同一个 “对象”,因此咱们就 exports = module.exports 。

总结:

  • exports是module.exports的一个引用
  • require引用模块后,返回给调用者的是module.exports而不是exports
  • exports.xxx,至关于在导出对象上挂属性,该属性对调用模块直接可见
  • exports = 至关于给exports对象从新赋值,调用模块不能访问exports对象及其属性
  • 若是此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,能够直接new实例 

 

参考资料

  https://www.zhihu.com/question/26621212

  https://www.cnblogs.com/axl234/p/6405370.html

  http://blog.csdn.net/pwiling/article/details/51958693

相关文章
相关标签/搜索