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