apply
## 方法重用
通过 apply() 方法,您能够编写用于不同对象的方法。
复制代码
apply
函数在前端的世界里大家都耳熟能祥了
关于apply
碰到了一道有意思的面试题记录下来。
我们先来看看这段代码:
function fn () {
console.log('hello this is apply)
}
fn.apply = function () {
console.log('调用apply')
}
复制代码
上边这段代码当我们需要使用fn.apply
的时候,想修改fn
的this
指向,应该如何做呢?
当我们平平常常(tianzhen)的来调用一下它的apply
fn.apply(null)
// 打印:调用apply
复制代码
打印结果是调用apply,这个时候我们已经重写了fn
上的apply
方法,再次调用apply
肯定调用的事我们重写后的apply
函数,这个时候就犯了难了,我就是想要在这个情况下调用fn
原本的apply
函数,我们应该怎么做?
别着急往下看,尝试思考思考。
其实有两种解决方式,我们先来看看第一种。
有的同学可能已经猜到了,apply
本质上是挂在Function.prototype
上的方法。既然我们重写了函数本身的apply
,而fn
的apply
也是通过原型去查找的。所以我们可以通过Function.prototype.apply
获得fn
函数原本的apply
方法。
这个时候我们需要调用它就很简单了
Function.prototype.apply.call(fn,null,[1,2,3])
复制代码
fn
,是我们传递给方法Function.prototype.apply
的this
。这样的话就相当于fn.apply
(此时的apply
是原型上的apply
方法)。
null
,是call
方法传递给apply
方法的第一个参数,也就是规定的this
指向。
apply
方法的参数。
这样就可以通过原型的方式调用fn
函数的apply
方法,并且支持自定义this
指向和传入指定参数。
Reflect
当然在Es6
中有一种更简单的方式,就是直接使用Reflect.apply(fn)
就可以直接达到想要的效果。
Reflect.apply(target, thisArgument, argumentsList)
复制代码
Reflect.apply()
Reflect.apply(fn, null, [1, 2, 3]);
复制代码