模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
1、axios 函数对象(可以作为函数使用去发送请求,也可以作为对象调用request方法发送请求)
❀ 一开始axios是一个函数,但是后续又给它添加上了一些属性【 方法属性】
■ 举例子(axios 函数对象调用axios()自身发送请求或调用属性的方法axios.request()发送请求的原理):
<script>
//一开始a只是一个函数
    var a = function () {
        console.log('hi');
    }
    var fn = function () {
        console.log('hi');
    }
    //给a这个函数对象添加属性后,让它的属性指向某个函数,则a调用自身函数,或者调用属性fn的方法----效果是一样的
    a.fn = fn;
    console.log(a);
    console.dir(a);
    a();
    a.fn();
</script>

✿ 模拟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>
												
											模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]的更多相关文章
- javascript面向对象方式,调用属性和方法
		
1.定义一个Person类,其中的属性和方法如果想对外开放,需要使用this,如: var Person=function(name,age,sex){ var psex='Boy'; if(sex) ...
 - C# 通过模拟http请求来调用soap、wsdl
		
C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...
 - 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
		
今天关闭一个窗体,报出这样的一个错误"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke.",这个不用多想,肯定是那个地方没有释放掉.既然碰到这个问题, ...
 - 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
		
本文转载:http://blog.csdn.net/playing9c/article/details/7471918 http://blog.csdn.net/beelinkerlidejun/ar ...
 - vue axios请求频繁时取消上一次请求
		
一.前言 在项目中经常有一些场景会连续发送多个请求,而异步会导致最后得到的结果不是我们想要的,并且对性能也有非常大的影响.例如一个搜索框,每输入一个字符都要发送一次请求,但输入过快的时候其实前面的请求 ...
 - 利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API
		
微软动态CRM专家罗勇 ,回复337或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 配置Dynamics 365 & PowerApps 支 ...
 - 本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口
		
QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将“js?”后面的appid参数(示例代码中的:100229 ...
 - qs.parse()、qs.stringify()使用方法, 以及在axios 中怎么用?
		
最近一直被纠结于传输格式,就在这里整理一下吧. qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. (axios 自带qs , // import qs from ' ...
 - Vue使用axios post方法发送json数据报415Unsupported Media Type
		
1.Vue使用axios post方法发送json数据 <template> <el-aside> <el-form ref="form" :mode ...
 
随机推荐
- Python的 垃圾回收机制
			
垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...
 - mysql如何查询某个库,某个表都有哪些字段
			
如下语句便可查看 SELECT column_name FROM Information_schema.columns WHERE table_Name = 'columns' AND TABLE_ ...
 - vue+uniapp实现美颜拍照录像,相册选择 | 录像限制时长,美颜拍照录像
			
一.插件简介 Zhimi-BeautyCamera(智密 - 美颜相机图册插件)是一个支持美颜录像,美颜拍照,选择图视频功能,带录像参数时长限制的uniapp原生插件.平台支持:Android.IOS ...
 - 10-2 bonding
			
创建bonding设备的配置文件 centos8 /etc/sysconfig/network-scripts/ifcfg-bond0 NAME=bond0 TYPE=bond DEVICE=bond ...
 - Swagger请求报错:TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
			
TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body. 如下图 ...
 - Spring Boot整合Thymeleaf及Thymeleaf页面基本语法
			
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
 - 【LeetCode】157. Read N Characters Given Read4 解题报告(C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接调用 日期 题目地址:https://leetco ...
 - 【LeetCode】1086. High Five 解题报告(C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 大根堆 日期 题目地址:https://leetcod ...
 - 【LeetCode】1071. Greatest Common Divisor of Strings 解题报告(Python & C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetc ...
 - Java 计算加几个月之后的时间
			
Java 计算加几个月之后的时间 public static Date getAfterMonth(String inputDate,int number) { Calendar c = Calend ...