开始学习之前听我废话两句
javascript为我们提供的各种优秀API极大程度提升我们的开发效率,作为初级前端er必须要对常用的API信手拈来,而中高级前端er则需要做到知其然且知其所以然,这也是中高级前端面试常考此类题目的原因。
手写实现API说难也不难,首先需要我们对API非常熟悉,知道它的每一步都做了什么事情,理清楚逻辑再倒推出实现步骤。下面是我在手写实现API过程中总结出来的精华,希望能帮到你们哦
我默认你们这些小机灵都掌握了文章内容提及的API的使用方法了啊,如果有朋友对某个API还不熟悉,那就先去学习一下再过来看吧
实现call/apply
call和apply的功能和用法很类似,他们的区别是apply接受参数使用的是数组数据类型。 所以我就放在一起写啦。
一句话简单介绍call/apply:
使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法,主要就是以下两步:
- 改变this的指向,指向我们指定的地方
- 使用传入的参数执行指定的函数
好的,现在我们已经知道这两个API执行过程中发生了什么事了,接下来就是解析和实现他们。
PS:我们先从call入手
实现第一步骤:改变this指向
假设我们想this指向obj对象,那我们是不是可以把要执行的函数复制到obj里面,再执行,这样就可以修改this指向了,是不是很容易咧。
这个时候有水友会问,欸?你这样不是给obj增加了一个不属于他的方法吗?不着急,我们执行完之后再把它删除掉不就好了嘛嘿嘿,话不多说,实践是检验真理的唯一标准:
Function.prototype.call2 = function(context) {
//首先要知道是谁调用了call函数,用this可以获取
context.f = this //复制函数
context.f(); //执行函数
delete context.f //删除函数
}
var obj = {
name: 'roger'
};
function showName() {
console.log(this.name);
}
showName.call2(obj) //roger
事实证明我们的思路没有错,接下来我们就要去解决传参的问题了
实现第二步骤:传参
棒棒的我们都知道,call第一个参数是this指向,后面的参数都是需要传入函数的参数,这样就造成了传入参数数量的不确定,这咋搞?
机智的我们还知道,函数有一个叫arguments的类数组对象,那我们可以取出第二个到最后一个参数,放到一个数组里面,然后再把这个数组里面的值都传入函数里执行:
Function.prototype.