如果把AjaxRequest当作方法不用new直接调用,函数里的this就会是是net对象,AjaxRequest.prototype里的方法就不能直接调用了,感觉AjaxRequest封装的不够好,理解都费了半天的劲。
onReadyState是AjaxRequest函数得一个属性,和AjaxRequest实例对象没有任何关系,他的this为AjaxRequest函数,onReadyState这个函数在调用时用了call方法把this改成了AjaxRequest实例对象,从整个代码来看onReadyState完全可以用var声明,而不要放到AjaxRequest下面,更容易理解,更简单的就是也放到prototype里头。
从而loader=this,this表示的是AjaxRequest实例对象【不是XMLHttpRequest对象,XMLHttpRequest没有req属性的】
分析代码可以猜测,.net里放了一堆相关的操作方法,而每个操作方法定义的变量函数都要隔离开来,因此可以更简单更容易理解的实现(从jquery里学来的)
var net={
//完完全全当做方法使用,而不用new了
AjaxRequest:(function(){
var AjaxRequest=function(url,onload){};
AjaxRequest.prototypt={
loadData:function(){
//着重onReadyState放到prototypt的改写过程
var This=this;//保存当前对象,不然onreadystatechange的this为window还是XMLHttpRequest?
this.req.onreadystatechange=function(){
This.onReadyState();
};
}
,onReadyState:function(){}
};
//net.AjaxRequest其实等于这个函数,他返回了一个对象从而不用new
return function(url,onload){
return new AjaxRequest(url,onload);
};
})()
,其他功能:function(){}
,其他功能x:function(){}
};
在js中, function也是对象.
net也是对象
var net = new Object(); //声明一个object对象
//alert(typeof net); //object
net.AjaxRequest = function(){}; //声明一个function对象
//alert(typeof net.AjaxRequest); //function
3. 在这里this指的是net.AjaxRequest
4. net.AjaxRequest.onReadyState 不加prototype是因为在22行要通过 "对象.方法" 的方式直接调用
你问的这几个问题,研究起来会有点深.. 相关连接我放到评论里.