揭秘axios:两种调用方式背后的天才设计
创作时间:
作者:
@小白创作中心
揭秘axios:两种调用方式背后的天才设计
引用
1
来源
1.
https://www.cnblogs.com/smileZAZ/p/18330636
axios作为前端开发中常用的HTTP请求库,其两种调用方式一直备受开发者关注。本文将深入解析axios的实现原理,帮助读者理解其设计思路。
axios的两种调用方式
经常调用接口的开发者一定对axios的两种使用方式非常熟悉:
- axios(config)
// 配置式请求
axios({
method: 'post',
url: '/user/12345',
});
- axios.post(url, config)
// 简洁的写法
axios.post('/user/12345')
你是否思考过这样的问题:axios到底是什么?为什么可以使用这两种方式调用接口?其设计原理是什么?
axios原理简析
为了搞清楚这些问题,我们先仿照axios源码实现一个简单的版本。
创建一个构造函数
function Axios(config){
this.defaults = config; // 配置对象
this.interceptors = { // 拦截器对象
request:{},
response:{}
}
}
原型上添加方法
Axios.prototype.request = function(config){
console.log('发送Ajax 请求 type:' +config.method)
}
Axios.prototype.get = function(){
return this.request({method:'GET'})
}
Axios.prototype.post = function(){
return this.request({method: 'POST'})
}
创建实例对象:
let axios = new Axios(config)
此时的axios是一个实例对象,包含defaults和interceptors属性,原型上包含request、get及post方法。但是,此时的axios不能使用axios(config)的形式调用接口。
axios的天才设计
为了同时支持axios(config)和axios.get()的调用方式,axios采用了以下核心设计:
function createInstance(config) {
const instance = Axios.prototype.request;
instance.get = Axios.prototype.get
instance.post = Axios.prototype.post
return instance;
}
let axios = createInstance();
通过上述代码,我们可以看到:
- axios是createInstance()函数的返回值instance
- instance是一个函数,因此可以使用axios(config)
- instance也是一个对象,其原型上有get方法和post方法,因此可以使用axios.post()
axios的源码实现
function createInstance(config) {
var context = new Axios(config);
var instance = Axios.prototype.request.bind(context);
Object.keys(Axios.prototype).forEach(key => {
instance[key] = Axios.prototype[key].bind(context);
})
Object.keys(context).forEach(key => {
instance[key] = context[key];
})
return instance;
}
这段代码精妙之处在于:
- 通过bind方法确保request方法内部的this指向正确
- 通过原型链继承实现方法复用
- 通过对象属性赋值实现功能扩展
总结
axios的设计思路充分体现了JavaScript语言的灵活性,通过巧妙地运用原型链和函数绑定,实现了简洁而强大的API设计。理解这些设计原理,不仅能帮助我们更好地使用axios,还能提升我们的编程能力。
热门推荐
手机视频格式转换轻松上手,解决兼容性问题享受数字生活
从创新药看医药研发活力:中国在研新药数量跃居全球第二位
内丹养生:在快节奏中找到身心的平衡绿洲
3D打印技术在旅游产业发展中的可能作用分析
汪苏泷演唱会大放异彩,粉丝盛赞其表现
垂直生活美学 | 自然共生的空间诗篇
养生也能“新中式”?
命门穴的作用与功效
荣耀股权架构解析:国资主导,沙特入股
上海海港赛季表现深度解析:从球员到战术的全方位分析
中医科普|如何在秋季调理脾胃?中医饮食与生活建议
发声抵制!为了训练AI,“版权卫士”Adobe陷入舆论漩涡
汉语拼音:音节与声调的微妙关系
中国095型核潜艇:高温气冷核反应堆与无轴泵推技术的完美结合
零息购车:背后的真相,你真的了解吗?
迪士尼的电影有哪些
员工工资表和工资条有什么不同?
留学回国考公必备:应届生身份判定指南
上海产业援藏模式研究④推进文旅融合,带动乡村振兴
如何求“导函数”,也就是导数?
合肥文旅 “融”出新活力
电子工程师必懂:电容的滤波作用原理与应用
跨年夜巅峰对决!王楚钦3比1战胜樊振东
8个低预算的高级感装修设计,业主不要求,设计师不会主动提
探索宇宙的奥秘:基普·索恩与刘江来在腾讯科学WE大会的深度演讲
嘴唇干燥、脱皮快别撕了!真心劝你这么做
如何理解“有恒产者有恒心”这句话?
宇宙这么大,科学家们是如何寻找类地行星的?
经管金融专业还是一个好选择吗——对经管金融类专业看法的历史变化
小程序与App的区别及其应用场景分析