为了账号安全,请及时绑定邮箱和手机立即绑定

js面向对象封装ajax

js面向对象封装ajax

当年话下 2019-06-07 07:06:32
为什么net.AjaxRequest是对象?而不是net?我之前一直以为AjaxRequest是方法。还有loader=this,这个this是指net.AjaxRequest的XMLHttpRequest对象?还有为什么net.AjaxRequest.onReadyState可以不用prototype?  
查看完整描述

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(){}

};



查看完整回答
反对 回复 2019-06-08
  • 2 回答
  • 0 关注
  • 664 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信