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;//区分作用域,保存this(application)对象 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(){ } */
express源码(1)
最新推荐文章于 2024-08-13 15:32:23 发布