JS中的Call方法使用

今天在熟悉新公司的开发平台时,看到很多JS里都调用了call方法,因为以前对js的使用很初级,使用的次数也很有限,所以初看到call这个方法的时候,竟然一点印象都没有,晕死!不过,通过在网上查找,算是对call有了一定的印象,^_^。 关于call方法,据微软的JScript帮助文档:
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

参数
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。 

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

要求
版本 5.5

请参阅
应用于:Function 对象
“调用一个对象的一个方法,以另一个对象替换当前对象”这句话感觉就像是个绕口令,估计是个老外写的中文帮助文档,^_^,不过在“说明”中还是说的比较清楚的。 下面,还是通过实际的例子来说明call的用法。 例子1:
//代码1
function funA(c){
	this.str = "this is funA:"+c;
	alert("this is funA's alert:"+this.str);
}

function funB(c){
	this.str = "this is funB:"+c;
	alert("this is funB's alert:"+this.str);
}
funA.call(funB,"abc");
//结果显示:this is funA's alert:this is funA:abc
funB.call(funA,"abc");
//结果显示:this is funB's alert:this is funB:abc
从例子1的结果来看,使用call方法后,所得到的结果和不使用call方法获得的结果是一样的!那么,call方法到底是起什么作用的呢? 例子2:
//代码2
function Class1() {
    this.name = "Class1";
    this.show = function() {
        alert("in class1, this.name="+this.name);
    };
}
function Class2() {
    this.name = "Class2";
    this.show = function() {
        alert("in class2, this.name="+this.name);
    };
}
var c1 = new Class1();
var c2 = new Class2();
c1.show.call(c2);
//结果显示:in class1, this.name=Class2
c1.show();
//结果显示:in class1, this.name=Class1
c2.show();
//结果显示:in class2, this.name=Class2
从例子2的结果中不难看出,在c1.show.call(c2)语句的执行结果,相当于一下代码的执行结果:
//代码3
function Class3() {
	this.name = "Class2";
	this.show = function() {
		alert("in class1, this.name="+this.name);
	};
}
var c3 = new Class3();
c3.show();
那么,这个代码3是如何来的呢? 再试验一个例子: 例四:
//代码4
function Class4() {
	this.name = "Class4";
	this.show = function() {
		alert(this.name+"-"+this.name2);
	}
}
function Class5() {
	this.name2 = "Class5";
}
var c4 = new Class4();
var c5 = new Class5();
c4.show.call(c5);
//结果显示:undefined-Class5
从这个例子的结果中,可以看出来,执行c4.show.call(c5)的时候,Class4已经变成了如下样子,即如代码5所示:
//代码5,改代码不可执行,只为客观的描述
function Class4() {
             this.name = "Class4";
	this2.name2 = "Class5";
	this.show = function() {
		alert(this2.name+"-"+this2.name2);
	};
}
所以,[object1.]func1.call(object2,arg1,arg2…);使用的最终结果可以归纳为:object1的方法func1内部的this对象被置换成了object2对象的this对象。
posted @ 2010-09-16 00:08  SillyCoder  阅读(413)  评论(0编辑  收藏  举报