在Node.js中, 以模块为单位划分所有功能, 并且提供了一个完整的模块加载机制, 这使得我们可以将应用程序划分为各个不同的部分, 并且对这些部分进行很好地协同管理。 通过将各种可重用代码编写在各种模块中的方法, 我们可以大大减少应用程序的代 码量,提高应用程序的开发效率以及应用程序代码的可读性。
下面聊一聊从模块外部访问模块内的成员的方式。
一.使用exports对象
在一个模块文件中定义的本地(即非函数内定义的)变量、函数或对象只在该模块内有效,当需要从模块外部引用这些变量、函数或对象时,需要在模块文件内使用exports对象,方法如下所示。
var myMsg = "hello";var funcname=function(){ return 'I`m funcname1 function.'};exports.msg=myMsg;exports.funcname=funcname;
然后, 即可从模块外部访问这些变量、函数或对象。例如, 将上述代码保存为foo.js文件后, 即可使用如下所示的代码访问模块内的msg变量及funcname函数。
//加载当前目录下的foo.js模块文件并将其赋值给foo模块对象var foo = require('./foo.js'); //通过foo模块对象的msg属性访问foo.js模块内的myMsg变量 console. log (foo. msg) ; //通过foo模块对象的funcname属性访问foo.js模块内的funcname函数console.log(foo.funcname ());
二.将模块定义为类
也可以在模块文件内将exports对象书写为"module.exports", 但是在需要将模块定义为一个类时, 只能使用"module.exports" 的书写方法。修改foo.js为如下代码。
var _name, _age;var name = '', age = 0;//模块对象的构造函数var foo = function(name, age) { _name = name; _age = age; } //获取私有变量_name的变量值foo.prototype.GetName = function() { return _name; } //设置私有变量_name的变量值foo.prototype.SetName = function(name) { _name = name; } //获取私有变量_age的变量值foo.prototype.GetAge = function() { return _age; } //设置私有变量_age的变量值foo.prototype.SetAge = function(age) { _age = age;}foo.prototype.name = name;foo.prototype.age = age;module.exports = foo;
新建一个加载foo.js模块文件的app.js脚本文件,在该脚本文件中,将执行如下所示的一列处理:
- 加载foo.js模块文件并使用模块文件中定义的foo类创建myFoo对象并初始化foo 类中定义的—name私有变量值及_age私有变量值。
- 使用myFoo对象的GetName方法获取_name私有变量值并在控制台中将其输出; 使用myFoo对象的GetAge方法获取—age私有变量值并将其在控制台中输出。
- 使用myFoo对象的SetName方法修改_name私有变量值;使用myFoo对象的 SetAge方法修改_age私有变量值。
- 使用myFoo对象的GetName方法获取修改后的_name私有变量值并在控制台中将 其输出;使用myFoo对象的GetAge方法获取修改后的_age私有变扯值并将其在控制台中输出。
- 直接获取myFoo对象的name公有变瞿值并在控制台中将其输出;直接获取myFoo对象的age公有变扯值并在控制台中将其输出。
- 直接修改myFoo对象的name公有变量值及age公有变量值。
- 直接获取myFoo对象的修改后的name公有变量值并在控制台中将其输出;直接获取myFoo对象的修改后的age公有变量值并在控制台中将其输出。
app.js脚本文件如下代码所示。
var foo = require('./foo.js');var myFoo = new foo ("Tom", 40); //新建模块对象console.log("获取修改前的私有变位值"); console.log(myFoo.GetName()); //获取模块对象内的_name私有变量值console.log(myFoo.GetAge()); //获取模块对象内的_age私有变量值console.log("修改私有变量值");myFoo.SetName("Bob") //设置模块对象内的_name私有变量值 myFoo.SetAge(30) //设置模块对象内的_age私有变量值console.log("获取修改后的私有变量值"); console.log(myFoo.GetName()); //获取模块对象内的_name私有变昼值console.log(myFoo.GetAge()); //获取模块对象内的_age私有变量值console.log("获取修改前的公有变昼值"); console.log(myFoo.name); //获取模块对象内的name公有变量值console.log(myFoo.age); //获取模块对象内的age公有变量值console.log("修改公有变昼值");myFoo.name="Bob" //设置模块对象内的name公有变量值myFoo.age = 30 //设置模块对象内的age公有变量值console.log("获取修改后的公有变世值"); console.log(myFoo.name); //获取模块对象内的name 公有变址值console.log(myFoo.age); //获取模块对象内的age公有变量值
三.为模块类定义类变量或类函数
当把模块定义为类时, 可以为该类定义类变械或类函数(相当于其他语言中的静态变量或静态函数, 在Node.js中称为类变量或类函数)。 接下来,我们修改 foo.js模块文件中的内容, 为foo类定义 一个staticName类变量与staticFunction类函数, 在 函数内部将staticName类变最值输出到控制台中, 代码如下所示。
//......foo.staticName = '';//定义类函数foo.staticFunction = function() { console.log(foo.staticName);}module.exports = foo;
同时修改app.js文件中的内容, 在文件底部添加如下所示的代码, 以设置staticName类变量值并调用staticFunction类函数将staticName类变量值输出到控制台中。
//......console.log("获取变量值");foo.staticName='Static Name';foo.staticFunction();