2009-12-04 17 views
5

私は変更できないサードパーティの機能を装飾する必要がありますので、どのような方法でも装飾する必要があります。プロトタイプでは、簡単に行うことができることがわかりました[1]。JavaScriptデコレータHOWTO?

jQueryまたはプレーンJavaScriptの代替手段はありますか?どのようなシナリオについて

[1] http://api.prototypejs.org/language/Function/prototype/wrap/

+0

注:ニードhttp://code.google.com/p/jquery-aop/

コードは次のようになります。 jqueryまたはplain jsでそれを行うには、別のjsフレームワークを追加することはできません。 –

答えて

4

は、ライブラリを必要?

  • 保存元の関数のコピー
  • は元
  • 店に場所を変更したバージョンへの参照を使用する関数の修正版を作成します。ネイティブのJavaScriptを使用して、あなたは、単にできているようですオリジナルは元々保存されていました。
+0

オリジナルのコピーを保存することはどういう意味ですか? これは何か? new_func = originalFunc function myExtendedVersion() { // do my stuff new_func(); // do my stuff }

+0

はい、次にoriginalFunc = myExtendedVersionを設定します。 –

0

私はライブラリによって提供されるラップ関数が好きです:Prototypeにはwrap関数があります。 ExtJSでは、createDelegateまたはcreateInterceptorを使用することがあります。 Dojoには宣言型AOPがあります。

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

これは、ありがとう、ありがとう。しかし、私は受け入れられた答えがより明確であることを発見しました。 –

-1

私はフランクSchwieterman解決のために行く:あなたはjqueryのAOPのプラグインでそれを行うことができ

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

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