javascript 对象初探 (六)--- call()和apply()初探

时间:2022-01-01 16:05:07

javascript中,每个函数都具有call()和apply()两个方法,您可以用她们来触发函数,并指定相关的调用参数。

此外,这两个方法还有另一个功能,就是她可以让一个对象去‘借用‘另一个对象的方法,并为己用。这也是一种简单的代码重用。

function her = {
   name : 'Anna',
   say:function(a){
        return 'Hello'+a+'I am'+this.name+'!'
   }
}

这样一来我们就能调用her对象的say方法。

her.say(Jon); // 'Hello Jon I am Anna!'

下面我们再创建一个对象,他只有一个name属性:

var his = {
    name : 'Jock'
}

显然her的say()方法也同样适用his()方法。因此我们希望say()方法当做his对象自身的方法来调用,这是就用到了call()或apply()方法:

her.say.call(his,'Meng'); // 'Hello Meng I am Jock!'

成功了,但您明白为啥吗?因为这样一来say()中的this就被自动设置成了his的对象的引用,因而this.name为Jock而不是Anna了!!!

另外,如果我们没有将对象传递给call()或apply()的首参数,或传递的是null,她的调用对象将会默认为全局对象(即this指向window)。---实际上call()的第一个参数修改了对象this的指向。

apply()的原理其实和call()是相同的,只不过区别在于参数的传递形式,下面来对比一下:

her.say.call(his, a,b,c);
her.say.apply(his, [a,b,c]);