模拟axios的创建[ 实现调用axios(config)自身发送请求或调用属性的方法发送请求axios.request(config) ]

目录

1、axios 函数对象,实现 调用axios(config)自身发送请求或调用属性的方法发送请求axios.request(config)

■ axios创建的源码:

✿  模拟axios的创建代码如下(bind函数的作用:主要是修改this指向,指向axios的实例):


1、axios 函数对象,实现 调用axios(config)自身发送请求或调用属性的方法发送请求axios.request(config)

■ axios创建的源码:

□ 起初axios【instance=bind(Axios.prototype.request, context);】是一个函数,在调用axios(config)函数发送请求时,实际上是调用Axios.prototype.request(config) 方法;

□ 在后续【utils.extend(instance, Axios.prototype, context);】又将Axios原型上的方法属性添加到instance身上。所以axios可以调用属性axios.request(config)发送请求;

❀ 我们知道直接调用axios(config) 发送Ajax请求,实际上是通Axios.prototype.requst(config) 发送Ajax请求


✿  模拟axios的创建代码如下(bind函数的作用:主要是修改this指向,指向axios的实例):

<script>
    //构造函数
    function Axios(config) {
        //初始化
        this.defaults = config;//default默认属性
        this.intercepters = {
            request: {},
            response: {}
        }
    }

    //为类的原型添加相关方法
    Axios.prototype.request = function (config) {
        console.log('发送ajax请求,请求类型:' + config.method)
    }
    Axios.prototype.get = function (config) {
        return this.request({method: 'GET'})
    }
    Axios.prototype.post = function (config) {
        return this.request({method: 'POST'})
    }

    //声明函数
    function createInstance(config) {
        //实例化一个对象
        var context = new Axios(config); //实例对象可以调用方法,例如 context.get() 但是不能直接当函数使用 context() ×
        var instance = Axios.prototype.request.bind(context);//instance 是一个函数,并且可以 instance({}),
        // 但是因为bind返回的是一个函数(一个拥有了Axios.prototype.request() 方法的函数,而instance的参数就是Axios的实例),所以不能 instance.get()

        //将Axios.prototype 对象中的方法添加到instance函数中,让instance拥有get、post、request等方法属性
        Object.keys(Axios.prototype).forEach(key => {
            // console.log(key); //修改this指向context
            instance[key] = Axios.prototype[key].bind(context);
        })
//总结一下,到此instance自身即相当于Axios原型的request方法,
//然后又给instance的属性添加了上了Axios原型的request、get、post方法属性
//然后调用instance自身或instance的方法属性时,修改了this指向context这个Axios实例对象

        //为instance函数对象添加属性 default 与 intercetors
        Object.keys(context).forEach(key => {
            instance[key] = context[key];
        })

        // console.dir(instance);
        return instance;
    }

    //测试一下axios的创建过程
    let axios = createInstance();
    //发送Ajax请求
    axios({method: 'POST'});
    axios.post({});
</script>

❀ 如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦,ღ( ´・ᴗ・` )比心。

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟庭大师兄

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值