相同点:
作用都是为了改变函数运行时上下文而存在的。
即改变函数体内部this的指向。
"说白点,a有xx方法,b没有。b可以问a借!"
不同点:
接受参数方式不一样。
call接受的是连续参数,apply接受的是数组参数。
A.call(this, a,b,c,d)
A.apply(this, [a,b,c,d])
继承使用:
通过call和apply,我们可以实现对象继承
var Parent = function(){
this.name = "xsf";
this.age = 22;
}
var child = {};
Parent.call(child); // child向Parent借
console.log(child);
调用父构造函数:
apply
var arr1 = [1,2];
var arr2 = [3,4];
Array.prototype.push.apply(arr1,arr2); // [1,2,3,4]
把arr2 push进arr1
相当于:
arr2.forEach(function(value){
arr1.push(value);
)
call
var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = [2,4];
Array.prototype.push.call(arr1,arr3,arr3); // [1,2,[3,4],[2,4]]不会拆分数组元素
非常实用的小技巧
求数组中的最大最小值,var arr = [22,3,24,54,65];
Math.max.apply(null, arr); // 65
Math.min.apply(null, arr); // 3
用call
就不行了,以上利用了apply
的传参特性!