2009-12-04 49 views

回答

4

那你的方案需要一個圖書館嗎?這似乎與本地JavaScript,你可以簡單地說:

  • 保存原有的功能
  • 的副本創建一個使用原
  • 商店的修改版本的參考功能的修改版本,其中原來是最初存儲的。
+0

你的意思是保存原件的副本? 這樣的事情? new_func = originalFunc function myExtendedVersion() { // do my stuff new_func(); // do my stuff } 2009-12-04 18:48:50

+0

是的,然後設置originalFunc = myExtendedVersion。 – 2009-12-04 18:53:09

0

我喜歡庫提供的wrap函數:Prototype具有wrap函數。在ExtJS中,可以使用createDelegate或createInterceptor。 Dojo具有聲明式AOP。 SANS框架,一個可以做到這一點:

myFunction(){ 
    something(); 
    thirdParty.call(); // or apply 
    perhapsSomethingElse(); 
} 
1

與jQuery,這將是很容易只添加其他功能使用。嘗試是這樣的:

//Sample function you're wrapping around 
function say_hi(){ 
    alert('hi'); 
} 

//quick jq plugin 
jQuery.fn.functionWrap = function(arg,opts){ 
    if(opts.before && typeof(opts.before)=='function'){ 
     opts.before(); 
    } 
    arg(); 
    if(opts.after && typeof(opts.after)=='function'){ 
     opts.after(); 
    } 
}; 


//sample function to use the wrapper func 
function btnPress(){ 
    $().functionWrap(
     say_hi, 
     { 
      before : function(){ alert('happens before'); }, 
      after : function(){ alert('happens after'); } 
     } 
    ); 
} 

嘗試添加到您的網頁,而這樣的事情來測試它:

<input type="button" value="asdf" onClick="btnPress();" /> 

希望這有助於你。

+0

這將做到這一點,謝謝。但我發現接受的答案更清楚。 – 2009-12-04 18:55:46

-1

我會去弗蘭克Schwieterman解決方案:

new_func = originalFunc 
function myExtendedVersion() 
{ 
    // do my stuff 
    new_func(); 
    // do my stuff 
} 
0

你可以用jQuery的AOP插件做到這一點:http://code.google.com/p/jquery-aop/

代碼是這樣:

jQuery.aop.around({target: window, method: 'originalFunc'}, 
    function(invocation) { 
    // do your stuff 
    invocation.proceed(); 
    // do your stuff 
    } 
);