关于apply和call()的区别,之前在笔试的时候就遇到过几次,答题的时候都还停留在,参数的不同上,一直没有仔细探究过。认真看过几篇文章,才发现里面的确是有js这门语言的奥秘。
一、Function.prototype.apply() 和 Function.prototype.call()
在看《JavaScript高级程序设计》这本书时提到由于“对象冒充”这种继承方法的流行,使得ES3为Function对象加入了两个新方法即apply()和call()。
二、参数不同
参数不同这点在我看了stackoverflow difference between call and apply
之后变得容易记住,两者的第一个参数都是用作this的对象,而apply()的第二个参数是要传递给函数的参数的数组,call()除this外其他参数都直接传递给函数自身。
theFunction.apply(valueForthis, arrayOfArgs);
theFunction.call(valueForthis, arg1, arg2,... );
A useful mnemonic is "A for array and C for columns of args"
一个有用的记忆方法是,A意味着数组,而C意味着一列参数。
三、实现高级语言中的继承
apply和call作为Function对象的方法,即表示每个Function对象的实例都有apply()和call()方法。
foo.apply(this, args) == foo.call(this, arg1, arg2, arg3) == this.foo(arg1, arg2, arg3)
此处foo是一个方法,this是方法执行时上下文相关对象,arg1,arg2,arg3,是传给foo方法的参数,“方法执行时的上下文对象”可以类比为面向对象编程中,在类实例化后对象中的this。
在JavaScript中,代码总是有一个上下文对象,代码处理该对象之内,上下文是通过this变量来体现的,这个this变量永远指向当前代码所处的对象中。
举个栗子:
输出结果:
此处把one对象中firstFunc类中的output方法拿来给second对象用,这正是高级语言中继承的概念。使用多个call()可以实现多继承,
再举个例子:
结果输出:
这样就实现了对象方法的多继承!
call()和apply()使得对象借用别人的方法来调用就像调用自己的一样。
厉害了javascript!
参考文章地址:关于javascript中apply()和call()方法的区别;
JS Call()与Apply();
如有错误,多多指教
next time~