2 回答
TA贡献1895条经验 获得超7个赞
如果把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里学来的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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(){} }; |
添加回答
举报