js面向对象封装ajax

2025-03-13 08:14:10
推荐回答(2个)
回答1:

如果把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(){}
};

回答2:

  1. 在js中, function也是对象.

  2. 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行要通过 "对象.方法" 的方式直接调用



你问的这几个问题,研究起来会有点深.. 相关连接我放到评论里.