2011-12-26 13 views
2

関数の呼び出しプロセスをどのようにオーバーロードできますか?関数の呼び出しプロセスをオーバーロードする方法

私のWebアプリケーションでは、関数の呼び出しの前に何かしたいのですが、呼び出しメソッドのプロトタイプなしでこれを行うにはどうすればいいのですか(これは試してみましたが、関数をmyFunction.call() )、依然として要求された効果があります。

私はそれを動作させるためにすべてを試しましたが、何もうまくいかず、難しい方法(呼び出し方法で)を行うには、すべてのコードを書き直さなければならないので実用的ではありません。

誰かが助けてくれますか?

+0

が重複する可能性[それは "コール" 機能を無効にすることは可能ですか?](http://stackoverflow.com/questions/7329923/is-it-possible-to-override-the-call – pimvdb

+0

私はあなたが正しい意味で「過負荷」という用語を使用しているとは思わない。とにかく、これを求めていますか? http://stackoverflow.com/questions/676721/calling-dynamic-function-with-dynamic-parameters-in-javascript –

+0

@pimvdbそれは重複していませんが、幾分似ています。私がしようとしているのは、呼び出しメソッドをオーバーライドするのではなく、関数を呼び出すための組み込みのプロセスで、私が言ったことを正確に行うことです。問題は、コールメソッドをオーバーライドすると、オーバーライドされたコール関数を介して関数を呼び出すことによってのみ機能することになります。これを行うと、前にセットで呼び出されたすべての関数を必要とするため、いわゆるイベントの後に。 – khael

答えて

3

各機能の定義を手動で変更することができます。
各関数呼び出しを手動で変更することができます。
これらのリファクタリングのいずれかが問題の範囲外にある場合は、気になるところにいます。

あなたの問題を解決するために私がよく知っている一般的な方法はありません。

NS = { 
    foo : function(){ console.log('foo'); }, 
    bar : function(){ console.log('bar'); } 
}; 

// <-- new code goes here 

NS.foo(); 
NS.bar(); 

// new code below, that should go after definitions but before the calls 

(function(){ 

    var pre = function(){ console.log('pre'); }, 
     post = function(){ console.log('post'); }; 

    for (var fn in NS) { 
     NS[fn] = (function(fn){ return function(){ pre(); fn(); post(); }; })(fn); 
    } 

})(); 
+0

'this'と' arguments'を '.apply'を使って渡すことで、コンテキスト/引数を有効にすることをお勧めします。 – pimvdb

+0

@pimvdb、ええ、それは私が "より一般的にするのは簡単です"という意味です。 – davin

3

あなたが作成することができます:あなたの機能はあなたが非常に簡単に次の操作を行うことができます(とprepost機能などをparametrisingことで、それははるかに一般的なことができます)グローバルにアクセスまたはその後、名前空間ですしかし場合

関数名を受け入れ、発信者機能、parammetersパラメータとしてコンテキスト:

function pre() { 
    alert("I'm before the call"); 
} 

function post() { 
    alert("I'm after the call"); 
} 


function caller(func, parameters, context) { 
    pre(); 

    func.apply(context, func, parameters.split(',')); 

    post(); 
} 
このよう呼び出すことができます Calling dynamic function with dynamic parameters in Javascript

または使用AnthonyWJonesソリューション:の

function caller(func){ 
    pre(); 

    this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 

    post(); 
} 
関連する問題