Node js模块系统

/*
模块是Node.js 应用程序的基本组成部分,文件和模块是对应的。换言之,一个  js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

一个模块可理解成一个类文件,通过require引入这个类文件并实例化一个对象,类文件中只有通过exports定义的方法变量才可被实例化对象调用,正常定义的方法变量只能在类内部互相调用
并且正常定义方法变量名可与exports定义的重名,这里为避免混淆,用不同命名


以下实例中,代码 require('./hello') 引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js)
之前通过require包含调用的都是node原生模块,如require("http");
require方法接受以下几种参数的传递:
http、fs、path等,原生模块。
./mod或../mod相对路径的文件模块。
/pathtomodule/mod绝对路径的文件模块。
mod非原生模块的文件模块。
 */
//===============================以下代码为main.js文件中内容==========================================

var hello = require('./hello');
hello.testFun1('use testFun1');
console.log(hello.testVal1);

//===============================以上代码为main.js文件中内容==========================================


//===============================以下代码为hello.js文件中内容==========================================

exports.testFun1 = function(setVal) {
    exports.testVal1 = setVal;
    console.log('Hello ' + exports.testVal1);
    testFun2();
    exports.testFun3();
}

function testFun2(){
    console.log('Hello ' + testVal2);
}

exports.testFun3 = function() {
    console.log('Hello ' + 'this is testFun3');
}

exports.testVal1 = 'this is testVla1';
testVal2 = 'this is testVla2';

//===============================以上代码为hello.js文件中内容==========================================

/*
执行main.js
node main.js
输出内容:
Hello use testFun1
Hello this is testVla2
Hello this is testFun3
use testFun1
*/


/*

有时候想把一个类对象封装到模块中,即一个模块代表一个类
模块js文件中可以写成如下格式
module.exports = function() {
    // ...
}
或
function testName() { //testName在这里只起到方法命名及给module.exports赋值作用,在调用页main.js中无用
    // ...
};
module.exports = testName;

在外部引用该模块时,给变量赋值的就是模块类本身(该类需要被实例化使用),而不是原先的直接的实例化对象。
例
*/
//===============================以下代码为main.js文件中内容==========================================

var TestClassName = require('./hello');
hello = new TestClassName();
hello.setName('风吹屁股凉冰冰');
hello.getName();
console.log(hello.name1);

//===============================以上代码为main.js文件中内容==========================================


//===============================以下代码为hello.js文件中内容==========================================

function ClassName() {
    this.name1 = ''; //用 this. 定义的变量和方法,在类内部使用时前面也需加this.。并且可被实例化的对象调用
    var  name2;      //用 var 定义的变量或直接定义的方法,类内部使用时可直接用,前面不用加this. 但不可被类实例化对象调用。并且用 var 定义的变量和直接定义的方法可与 this. 定义的重名,这里为避免混淆,用不同命名。
    this.trueName = '';
    this.setName = function(theName) {
        this.trueName = theName;
    };
    this.getName = function() {
        this.test1();
        test2();
        console.log('Hello ' + this.name1 + ' ' + name2 + ' ' + this.trueName);
    };
    this.test1 = function(){
        this.name1 = 'test1Name';
    }
    function test2(){
        name2 = 'test2Name';
    }
};
module.exports = ClassName;

//===============================以上代码为hello.js文件中内容==========================================
/*
执行main.js
node main.js
输出内容:
Hello test1Name test2Name 风吹屁股凉冰冰
test1Name
*/

 

posted @ 2018-03-13 21:13  风吹屁股凉冰冰  阅读(185)  评论(0编辑  收藏  举报