1.什么是apply()和call()
<1.apply()和call()是函数自带的两个函数,二者作用一致
<2.作用:改变方法中的this。例:say.call(小怪兽),将方法say()中的this指向对象‘小怪兽’
2.什么时候使用apply()和call()
在js面向对象编程中,我们经常这样定义:
function cat() { } cat.prototype = { food : 'jerry', say : function () { console.log('I like '+ this.food); } }; let cat_tom = new cat(); cat_tom.say(); // I like jerry
假如:有一个对象
mouse = {food:'tom'}
我们 不想对它 mouse 重新定义say方法,那么我们可以通过call或apply来使用 cat_tom的say方法,如下:
我们 不想对它 mouse 重新定义say方法,那么我们可以通过call或apply来使用 cat_tom的say方法,如下:
let mouse = {food:'tom'}; cat_tom.say.call(mouse); //I like tom cat_tom.say.apply(mouse); //I like tom
所以,可以看出call和apply是为了
动态改变this而出现的;
当一个object没有某个方法,但是其他的
对象有,我们可以借助call或apply用其它对象的方法来操作。
3.apply()和call()的唯一区别
- apply()把参数打包成Array再传入;
- call()把参数按顺序传入。
比如调用Math.max(1, 2, 3),分别用apply()和call()实现如下:
Math.max.apply(null, [1, 2, 3]); // 3 Math.max.call(null, 1, 2, 3); // 3