日期:2014-05-16  浏览次数:20385 次

javascript难点之三:没有见过的怪物call
Call这个东西也不是很好理解的=。=+,如果你之前一直在学JAVA或者C++,而后才接触JS的话,call可能就是你的一个噩梦。噩梦归噩梦,只要醒了也就没事了,下面就是把你打醒的过程,而且此过程无任何疼痛感,就是给你泼一个冷水,一下子就清醒了。
依然是先看定义:call:执行与此对象相关联的代码。通过函数调用表达式启用它。实现这个内部方法的对象被称为 函数。
手册上的解释为:调用对象的一个方法,以另一个对象替换当前对象。call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
还是手册上解释的浅显易懂,其实call的用法就是如下了。
C对象.A方法.call(B对象)
很简单,call这个方法就相当于把C对象的方法A抢过来,塞到对象B的肚子里,然后根据对象B的情况来调用A方法。看下面例子
   function who(){
alert(this.name);
};
window.who();
var me = {name:"aaa"};
    me.who = who;
me.who();

var c = {};
who.call(c);//c里没有name属性,显示未定义
me.who.call(c);//c里没有name属性,显示未定义
c.name="MMM";
me.who.call(c);//c里有了name属性,显示MMM
如果方法要传入参数的话,就这么写,me.who.call(c,参数1, 参数2....)当然,这个例子里不需要参数。
顺便说一下,这个CALL还可以用来模拟C++中的多继承,具体怎么用,随便一搜就懂了,反正也只是利用CALL方法本来的特性而已。还有一个apply方法和call用法基本相同,只不过apply后面要这样写apply(对象,数组),第二个参数只能是数组。
这下应该清楚了=。=+噩梦醒了吧。