express源码(1)

var http = require("http");


var Application = function(){//js当中没有明确的构造器概念,都是以首字母大写来区分
    //保存路由
    this.router = [{
        path:"*",
        fn:function(req,res){
            res.writeHead(404,{"Content-type":"text/plain"});
            //req.method:请求的方法(get/post)
            res.end("Cannot " + req.method + ' ' + req.url);
        }
    }];
}
// 那么,在使用new操作符来调用一个构造函数的时候,发生了什么呢?其实很简单,就发生了四件事:
// var obj  ={};
// obj.__proto__ = CO.prototype;
// CO.call(obj);
// return obj;
//
// 第一行,创建一个空对象obj//

// 第二行,将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象,这是最关键的一步,具体细节将在下文描述。
//
// 第三行,将构造函数的作用域赋给新对象,因此CA函数中的this指向新对象obj,然后再调用CO函数。于是我们就给obj对象赋值了一个成员变量p,这个成员变量的值是” I’min constructed object”//
// 第四行,返回新对象obj。当构造函数里包含返回语句时情况比较特殊,这种情况会在下文中说到。
Application.prototype = {
    use:function(path,fn){//path:传入的路由名字,fn:传入的路由回调函数
        this.router.push({
            path:path,
            fn:fn
        });
    },
    listen:function(port){
        var self = this;//区分作用域,保存thisapplication)对象
        http.createServer (function(req,res){
            //我需要指向谁,而这里的this又指向谁呢?
            //执行到这里的时候就有必要判断路由了
            for(var i = 1;i < self.router.length;i++){
                if(req.url == self.router[i].path){
                    return self.router[i].fn(req,res);
                }
            }
            return self.router[0].fn(req,res);
        }).listen(Number(port));//判断类型
    }
}

var app = new Application();//得到一个application对象

app.use("/",function(req,res){
    res.writeHead(200,{"Content-type":"text/plain"});
    res.end("Hello World~!");
});

app.listen(3000);

/*
Application.prototype.use = function(){

}

Application.prototype.listen = function(){

}

*/




























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值