天天看點

js筆記——了解js中的call及apply

call及apply在js裡經常碰得到,但一直感覺很陌生,不能熟練使用。怎樣才能熟練應用呢?

在javascript oop中,我們經常會這樣定義:

但是如果我們有一個對象<code>whitedog = {food:"bone"}</code>,我們不想對它重新定義say方法,那麼我們可以通過<code>call</code>或<code>apply</code>用<code>blackcat</code>的<code>say</code>方法:

是以,可以看出call和apply是為了動态改變this而出現的,當一個object沒有某個方法,但是其他的有,我們可以借助call或apply用其它對象的方法來操作。

用的比較多的,通過<code>document.getelementsbytagname</code>選擇的<code>dom</code> 節點是一種類似array的array。它不能應用<code>array</code>下的push,pop等方法。我們可以通過:

這樣domnodes就可以應用array下的所有方法了。

call 和 apply 都是為了改變某個函數運作時的 context 即上下文而存在的。換句話說,就是為了改變函數體内部 this 的指向。

因為 javascript 的函數存在「定義時上下文」和「運作時上下文」以及「上下文是可以改變的」這樣的概念。二者的作用完全一樣,隻是接受參數的方式不太一樣。

例如,有一個函數 func1 定義如下:

就可以通過 <code>func1.call(this, arg1, arg2);</code> 或者 <code>func1.apply(this, [arg1, arg2]);</code>來調用。其中 <code>this</code> 是你想指定的上下文,他可以任何一個 <code>javascript</code> 對象(javascript 中一切皆對象),call 需要把參數按順序傳遞進去,而 apply 則是把參數放在數組裡。

javascript 中,某個函數的參數數量是不固定的,是以要說适用條件的話,當你的參數是明确知道數量時,用 call,而不确定的時候,用

apply,然後把參數 push 進數組傳遞進去。當參數數量不确定時,函數内部也可以通過 arguments 這個數組來便利所有的參數。

call方法:

文法:<code>call([thisobj[,arg1[, arg2[, [,.argn]]]]])</code>

定義:調用一個對象的一個方法,以另一個對象替換目前對象。

說明:

call 方法可以用來代替另一個對象調用一個方法。call 方法可将一個函數的對象上下文從初始的上下文改變為由 thisobj 指定的新對象。

如果沒有提供 thisobj 參數,那麼 global 對象被用作 thisobj。

apply方法:

文法:<code>apply([thisobj[,argarray]])</code>

定義:應用某一對象的一個方法,用另一個對象替換目前對象。

如果 argarray 不是一個有效的數組或者不是 arguments 對象,那麼将導緻一個 typeerror。

如果沒有提供 argarray 和 thisobj 任何一個參數,那麼 global 對象将被用作 thisobj, 并且無法被傳遞任何參數。

a、

這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,是以運作結果為:alert(4); // 注意:js 中的函數其實是對象,函數名是對 function 對象的引用。

b、

call 的意思是把 animal 的方法放到cat上執行,原來cat是沒有showname() 方法,現在是把animal 的showname()方法放到 cat上來執行,是以this.name 應該是 cat

c、實作繼承

animal.call(this) 的意思就是使用 animal對象代替this對象,那麼 cat中不就有animal的所有屬性和方法了嗎,cat對象就能夠直接調用animal的方法以及屬性了.

d、多重繼承

很簡單,使用兩個 call 就實作多重繼承了

繼續閱讀