2011-12-12 55 views
0

所以,我做了这段代码来帮助我添加函数之前或之前的其他功能,但我想不出一个更好的方式来做到这一点,我不得不使用eval(),那是真的不是一个好习惯。起初,我试图做一些事情:面向Javascript的东西

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! 

我不想与物体或任何工作,我只是想后还是

+0

还要注意你的依靠'Function.prototype.toString'返回的东西理智,不会。 – Raynos

回答

0

我有一个实用程序库称为fcombine之前我已经声明函数中添加更多的代码支持

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

你的代码丑陋的原因是因为你没有返回新的函数。

您的代码的问题还在于它使用eval并试图做太多的魔法。传递一串变量名称然后回避这个绝对可怕的整个想法。

你可以非常容易地编写

hello = Aspects.append(hello, new_function);

这表现在fcombine.post

+0

谢谢,是的,我认为我将不得不放弃一些魔法并返回新的功能。你的图书馆似乎非常有用,谢谢。 –

-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); 
    } 
} 
+0

这只适用于全局变量。这使得它成为无用的解决方案,因为应该不惜一切代价避免全局变量。 – Raynos

+0

这不能在Node.JS上工作,例如因为我没有窗口,这就是为什么我使用eval(),你知道是否有东西可以取代它吗? –