天天看点

JavaScript中的apply,call与this的纠缠

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)官方实例:

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

    (2)实例:

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

分析:根据定义:调用函数,并用指定对象替换函数的 this 值,

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

要注意js中的函数名其实是对象,因为函数名是对funtion对象的引用!

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

分析:根据定义:调用一个对象的方法,用另一个对象替换当前对象。

这里就是调用对象add的方法,并用add对象替换当前对象sub;

再来一个例子:

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

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

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

分析:定义:调用一个对象的方法,用另一个对象替换当前对象。

调用fun1对象的方法,用window对象替换当前fun1中的对象。

调用fun1对象的方法,用input中对象替换当前fun1中的对象。

调用fun1对象的方法,用新new出来的obj中的对象替换当前fun1中的对象。

5.继承

例一:

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

结果:b

          b

问题:

为什么是b?

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

我们可以看到调用的时候,this的指向

为什么两个都是b?

classb.call(this) 将 classa.call(this)的属性与方法覆盖。最后只有classb的属性与方法。

例二:这个看上去更像java里面的继承感觉

JavaScript中的apply,call与this的纠缠
JavaScript中的apply,call与this的纠缠

结果:zqz

        function classbextendclassa(){

    classa.call(this);

this.job = 'coder';

 }

       coder

转载:http://www.cnblogs.com/zqzjs/p/5017918.html

继续阅读