前端开发前端

什么时候用module.export?什么时候用exports?

2017-11-29  本文已影响3541人  CPChen

创建/引用module

你可以用它创建你的模块。例如:(假设这是rocker.js文件)

exports.name = function() {
    console.log('my name is cp');
}

在另一个文件中引用rocker.js

var rocker = require('./rocker.js');
rocker.name(); // my name is cp

先来看一个例子

var a = {name: 1};
var b = a;

console.log(a);
console.log(b);

b.name = 2;
console.log(a);
console.log(b);

var b = {name: 3};
console.log(a);
console.log(b);

// 运行输出结果为:
// { name: 1 }
// { name: 1 }
// { name: 2 }
// { name: 2 }
// { name: 2 }
// { name: 3 }

a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。

module.exports和exports到底是什么?

其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports。

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

module.exports = 'ROCK IT!';
exports.name = function() {
    console.log('my name is cp');
}

再次引用执行rocker.js

var rocker = require('./rocker.js');
rocker.name();

出现报错:rocker.name is not a function

结论:

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

用两个例子来解析

例子1:
下面例子中,你的模块是一个类:

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

你可以这样引用它:

var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old

例子2:
下面例子中,你的模块是一个数组:

module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];

你可以这样引用它:

var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); // Rocking in heaven: Ronnie James Dio

什么时候用exports?什么时候用module.exports?

从以上两个例子,我们可以总结出:

  • 如果你想你的模块是一个特定的类型就用Module.exports。
  • 如果你想的模块是一个典型的“实例化对象”就用exports。

给module.exports添加属性类似于给exports添加属性,例如:

module.export.name = function() {
    console.log('my name is cp');
}

同样,exports是这样的

exports.name = function() {
    console.log('my name is cp');
}

注意: 这两种结果并不相同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的“实例化对象”改变成一个类型。

上一篇下一篇

猜你喜欢

热点阅读