nodejs 提供了exports(模块公开接口) 和 require(外部调用模块) 两个对象
exports 本身只是简单的一个空对象 {} ,专门用来声明接口
module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
exports和module.exports同时出现,module.exports会覆盖exports
对象用module.exports,导出多个方法和变量用exports
模块的加载
- require( )进行加载,可以使用node_modules的模块,也可以利用相对路径和绝对路径加载自己的模块
module.exports 初始值为一个空对象 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是 exports
模块的创建
- 创建一个函数,将一个函数导出,就是使得其他模块可以调用这个模块
// name.js
var name;
exports.setName = function(SayName){
name = SayName;
}
exports.SayName = function(){
console.log(name);
}
// main.js
var name = require(‘name.js’); // var name = require(‘name’);默认后缀是js
name.setName(“zhangfan”);
var name2 = require(‘name.js’);
name2.setName(“2222”);
name1.SayName();
//输出是2222,
原因:node js是单次加载的
因为 name 是全局变量,所以第2次调用,使得第一次加载的name 初始化为 2222
所以输出为 2222
但是如果想要每次调用参数不一样输出不一样的话,可以将name 封装为局部变量
使用 modules.exports 覆盖 exports
//name.js
function Name(){
var name ;
this.satName=function(Name){
name=Name;
}
this.sayName=function(){
console.log(name);
}
}
// 1. exports.Name =Name;
- module.exports = Name;
//使用2 main.js
//输出 zhangfan
// 2222
var Name = require(‘name.js’); // var name = require(‘name’);默认后缀是js
name = new Name();
name.setName(“zhangfan”);
var name2 = require(‘name.js’);
name2.setName(“2222”);
name1.SayName();
// 使用 1. main.js
var Name = require(‘name.js’).Name; // var name = require(‘name’);默认后缀是js
name = new Name();
name.setName(“zhangfan”);
var name2 = require(‘name.js’);
name2.setName(“2222”);
name1.SayName();