apply():能继承另外一个Function对象的方法和属性,调用一个对象的一个方法,用另一个对象替换当前对象;
call():与apply()的意思一样,但是参数列表不同;
语法如下:
function.apply(thisObj[,argArray]);
function.call(thisObj[,arg1[,arg2[,arg3]]]);
B.apply(A,arguments);即A对象应用B对象的方法;
B.call(A,arg1,arg2);
相同之处:都可以用来代替另一个对象调用一个方法,讲一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
不同之处:传入参数不同。
/*基本用法*/
function add(a,b) {
return a+b;
}
function sub(a,b) {
return a-b;
}
var a1 = add.apply(sub,[4,2]);
var a2 = sub.apply(add,[4,2]);
var a3 = add.call(sub,4,2);
var a4 = sub.call(add,4,2);
console.log(a1);
console.log(a2);
console.log(a3);
console.log(a4);
/*实现继承*/
function Animal(name) {
this.name = name;
this.showName = function () {
alert(name);
}
}
function Cat(name) {
Animal.apply(this,[name]);
}
var cat = new Cat("喵喵");
cat.showName();
/*多重继承*/
function parent1() {
this.showSub = function (a,b) {
alert(a-b);
}
}
function parent2() {
this.showAdd = function (a,b) {
alert(a+b);
}
}
function child() {
parent1.apply(this);
parent2.apply(this);
}
var b = new child();
b.showSub(3,1);
b.showAdd(3,1);
apply的其它用法:
1.Math.max可以实现数组中最大的一项,Math.min可以实现数组中最小的一项:
Math.max不支持参数为数组,但支持多个参数,所以根据apply的特点来解决;
var arr = [1,3,2,4];
var max = Math.max.apply(null,arr);
alert("max=" + max);
var min = Math.min.apply(null,arr);
alert("min=" + min);
/*在调用时第一个参数给了null,这是因为没有对象调用这个方法,只需要这个方法进行运算*/
2.Array.prototype.push可以实现两个数组的合并:
push方法没有提供push一个数组,但提供了push(param1,param2,param3),所以根据apply的特点来解决;
var arr1 = new Array("1","2","3");
var arr2 = new Array("4","5","6");
alert(Array.prototype.push.apply(arr1,arr2));
总结:一般在目标函数只需要n个参数列表,而不接受数组形式,可以通过apply的方式巧妙解决;