2

いくつかのjavascriptコードがあります、例えば

function hello() {
}
function world() {
}

それらにロギングコードを追加したいのですが、コードを変更したくありません。別のファイルにコードを記述できれば、実行時に関数が変更されることを願っています。これを行うことは可能ですか?


アップデート

2つの答えに感謝しますが、私はこの質問をより明確にする必要があります。

helloand関数はほんの一部のworldサンプルであり、実際にはファイルには何百もの関数があり、それらを手動で再定義するために実装されています。

これを自動的に行う方法を探しています(JavaのAspectJと同様)。

4

4 に答える 4

3

関数を変更することはできませんが、関数をラップして関数をラッパーに置き換えることはできます。

そのような(ライブデモを参照):

function logFactory(func, message) {
    return function () {
        console.log(message);
        return func.apply(this, arguments);
    }
}

hello = logFactory(hello, "Some log message");

これにより、関数によって操作されている間はデータを取得したり、関数内で行われることを変更したりすることはできません(ただし、引数をキャプチャして渡す前に変更することができ、戻り値をキャプチャして変更することもできます)返却する前に)。

于 2013-03-06T15:17:33.800 に答える
2

いつでも別の関数名を使用して、「拡張」したい関数を呼び出すことができます

function extendSomefunction(param) {
    somefunction(param);
    // additional things here
}

しかし、ここで見つけることができる別のトリック

コピーされたコード:

var origParseFloat = parseFloat;
parseFloat = function(str) {
     alert("And I'm in your floats!");
     return origParseFloat(str);
}
于 2013-03-06T15:17:25.350 に答える
1

新しいバージョン内で関数をラップする以外に、JavaScriptファイルをサーバーから離れる前に変更する以外に、他に選択肢はありません。手動で、ビルドステップとして、またはHttpHandlerを介してオンザフライで。これは、実行時にラップするために公開されていないプライベート関数とプライベート参照もキャッチするため、最も堅牢なソリューションです。ただし、手間がかかるので、上記の簡単な関数ラッピングの答えで十分なら、心からお勧めします!

于 2013-03-06T15:51:04.467 に答える
-1

関数をラップして、ラッパーに置き換えることができます。

var originalHello;
originalHello = hello;

hello = function () {
    // log your stuff
    console.log('fired before original hello is triggered');

    // call original hello with the current scope & arguments
    originalHello.apply(this, arguments);
}
于 2013-03-06T15:27:16.770 に答える