1.apply定义
apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数。
语法:apply([thisobj[,argarray]])
thisobj
可选。要用作 this 对象的对象。
argarray
可选。要传递到函数的一组参数。
2.call定义
call:调用一个对象的方法,用另一个对象替换当前对象。
语法:call([thisobj[, arg1[, arg2[, [, argn]]]]])
可选。将作为当前对象使用的对象。
arg1, arg2, , argn
可选。将被传递到该方法的参数列表。
3.二者区别
call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments。
定义也是有差别的。
4.实例分析
(1)官方实例:


(2)实例:


分析:根据定义:调用函数,并用指定对象替换函数的 this 值,
这里调用函数zqz,并用指定的对象zqz_1替换zqz函数的this值。
要注意js中的函数名其实是对象,因为函数名是对funtion对象的引用!


分析:根据定义:调用一个对象的方法,用另一个对象替换当前对象。
这里就是调用对象add的方法,并用add对象替换当前对象sub;
再来一个例子:


这里调用函数zqz,使用指定的对象this替换函数zqz的this。


分析:定义:调用一个对象的方法,用另一个对象替换当前对象。
调用fun1对象的方法,用window对象替换当前fun1中的对象。
调用fun1对象的方法,用input中对象替换当前fun1中的对象。
调用fun1对象的方法,用新new出来的obj中的对象替换当前fun1中的对象。
5.继承
例一:


结果:b
b
问题:
为什么是b?
我们可以看到调用的时候,this的指向
为什么两个都是b?
classb.call(this) 将 classa.call(this)的属性与方法覆盖。最后只有classb的属性与方法。
例二:这个看上去更像java里面的继承感觉


结果:zqz
function classbextendclassa(){
classa.call(this);
this.job = 'coder';
}
coder
转载:http://www.cnblogs.com/zqzjs/p/5017918.html