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

只是为了展示方法,函数 parentwindow也可以是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 回答