2011-12-12 57 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(),你知道是否有東西可以取代它嗎? –