在JavaScript中,函數是可以帶有方法的對象。Ext庫提供的擴充會對Function對象——包括內建的函數、你定義的函數,這些都會繼承。添加這些的方法能方便地綁定函數到特定的範圍。
範圍的重要性
在JavaScript中,你引用一函數,使之成為handler,和在C中使用函數指標有相類似的方式。這意味著預設情況下沒有對象是綁定到對象的,並且this這個變數會是瀏覽器的window對象。如果要寫OO的Javascript,那麼這將會引起很多的誤解和錯誤的出現。下列的 Function方法允許你綁定一個對象到其所在的函數中(其this的指向引用),連同參數列表綁定到函數中。
委託和回調
createDelegate
createDelegate(API參考)允許你將對象綁定一個在其範圍下的函數,亦可將特定的多個參數,寫成數組傳入到那個函數中去。可選地,這需要一個參數來指定是否將參數列表傳入到這個數組中去。如果這個第三的參數沒有傳入,數組將是整個的參數列表。
例子:
var fn = func1.createDelegate(scope, [arg1,arg2], true)
fn(a,b,c) === scope.func1(a,b,c,arg1,arg2);
var fn = func1.createDelegate(scope, [arg1,arg2])
fn(a,b,c) === scope.func1(arg1,arg2);
var fn = func1.createDelegate(scope, [arg1,arg2], 1)
fn(a,b,c) === scope.func1(a,arg1,arg2,b,c);
createCallback
createCallback (API參考) 允許你將多個參數綁定到一個函數。指定參數作為createCallback的變數便可。
例子:
var fn = func1.createCallback(arg1, arg2);
fn() === func1(arg1, arg2)
AOP功能
EXT庫亦提供一些基礎性的 aspect-oriented programming(AOP面向切面編程)機制。這意味著你選擇的函數可在另一函數的之前或之後被調用,並根據外部結果動態改變執行流程鏈。當你欲擴充Ext內建函數的行為(behavior)時,利用該機制可無須繼承或重載原Ext版本。使用下列兩個方法,你可在某一函數之前或之後加上你想實現的功能。
createInterceptor
createInterceptor (API參考)允許你指定一個函數在這個函數之前調用。原函數的所有參數都會傳入給它。如果它返回false,原函數將不會被調用。範圍的參數可選地使用。
createSequence
createSequence (API參考)允許你指定一個函數在這個函數之後調用。原函數的所有參數都會傳入給它。範圍的參數可選地使用。
延時執行
Ext提供了一個便捷的方法來封裝JavaScript內建方法setTimeout。defer函數(API參考)允許你在某一定時間間隔之後執行函數,而且可指定執行所在的範圍,連同多個參數的傳入一同被調用。