(转)JavaScript中call与apply方法
LastUpdate 2009-9-12
1.call方法
官方(JavaScript手册):
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
2.apply方法
官方(JavaScript手册):
应用某一对象的一个方法,用另一个对象替换当前对象。
apply([thisObj[,argArray]])
参数
thisObj 可选项。将被用作当前对象的对象。
argArray 可选项。将被传递给该函数的参数数组。
说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
两者的区别:
两者实现的功能是完全一样的,只是参数传递方式不一样,call是将各个参数以逗号(,)隔开,而apply是将所有参数组成一个数组进行传递。
参考代码:
function fun_one() {
this.a = "I'm string a";
this.b = "I'm string b";
//未定义this.c,但调用的是fun_two里面的,所以定不定义都无所谓;
this.fun = function(p1,p2) {
var s = "this.a: " + this.a + "\nthis.b: " + this.b + "\nthis.c: " + this.c + "\n\n其它参数:\np1="+p1+"\np2="+p2;
alert(s);
}
}
function fun_two() {
this.b = "I'm other string b";
//未定义this.a,所以返回undefined
this.c = "I'm string c";
}
var obj1 = new fun_one();
var obj2 = new fun_two();
/*
运行obj1对象的fun方法时,将obj1的this转为obj2对象的this
因此fun_one里面的this.c实际是fun_two里面的this.c
*/
//obj1.fun.call(obj2,"1st arg","2nd arg"); //用call实现
obj1.fun.apply(obj2,new Array("1st arg","2nd arg")); //用apply实现
总结:
从上面的例子可看出:
obj1.method1.call(obj2,argument1,argument2)
简单的说就是把obj1的方法放到obj2上使用,后面的argument1..这些做为参数传入