0

したがって、他の関数の前後に関数を追加するためにこのコードを作成しましたが、それを行うためのより良い方法を見つけることができませんでした。eval()を使用する必要があり、それは実際には良い習慣ではありません。最初、私は次のようなことをしようとしました:

Function.prototype.append = function(fn){
    eval("this = function(){ ("+this.toString()+").apply(this, arguments); fn.apply(this, arguments); }");
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!
hello.append(function(){
    console.log("bye world!");
});
hello(); // hello world! bye world

しかし、関数自体を変更できないため、機能しませんでした。だから私はこれをしました:

Aspects = new Object();

Aspects.append = function(aspect, fn){
    eval(aspect + " = function(){ ("+eval(aspect + '.toString()')+").apply(this, arguments); fn.apply(this, arguments); }");
}

Aspects.prepend = function(aspect, fn){
    eval(aspect + " = function(){ fn.apply(this, arguments); ("+eval(aspect + '.toString()')+").apply(this, arguments); }");
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!

Aspects.append('hello', function(){
    console.log("bye world!");
});

hello(); // hello world! bye world!

オブジェクトなどを操作したくないので、すでに宣言されている関数の前後にコードを追加したいだけです

4

2 に答える 2

0

私はfcombineと呼ばれるユーティリティライブラリを持っています。

f1 = fcombine.pre(new_function, f1);
f1 = fcombine.post(f1, new_function);

コードが醜い理由は、新しい関数を返さないためです。

コードの問題は、それevalがあまりにも多くの魔法を使用して実行しようとすることでもあります。変数名の文字列を渡してから評価するという考え全体は、絶対に恐ろしいものです。

あなたは非常に簡単に書くことができます

hello = Aspects.append(hello, new_function);

によって示されるようにfcombine.post

于 2011-12-12T12:10:37.630 に答える
-1

これはどうですか、

function fnAppend(old_fn_name, new_fn){
    var old_fn = window[old_fn_name];
    window[old_fn_name] = function(){
        old_fn();
        new_fn();
    }
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!
fnAppend('hello', function(){
    console.log("bye world!");
});
hello(); // hello world! bye world

アプローチを示すために、関数の親は関数windowのオプションの引数にすることもできfnAppendます。順番を変えるだけでfnPrepend


編集

function fnAppend(old_fn_name, new_fn, obj){
    obj = obj || window;
    var old_fn = obj[old_fn_name];
    obj[old_fn_name] = function(){
        old_fn.apply({},arguments);
        new_fn.apply({},arguments);
    }
}
于 2011-12-12T12:17:54.110 に答える