2009-02-20 50 views
5

我可以代理在做這樣的事情的javascript功能單一(只是從內存記下來,多多包涵)在JavaScript中的動態代理?

function addAroundAdvice(target){ 
    var targetFunction = target.aFunction; 
    target.aFunction = new function(){ 
      invokePreCall(); 
      targetFunction.apply(target, arguments); 
      invokePostCall(); 
    } 
} 

作爲一個Java程序員我認爲這是一個動態代理。每次我寫這樣的代碼時,我認爲有人必須做出一個非常聰明的庫,它執行的常見代理操作至少比我能夠匆忙做的要好10%。我期待一些東西,比如正確攔截任何給定對象的所有方法,這可能不是完全無關緊要的。然後有不同類型的建議。所以雖然我不期待scriptaculous的大小,但它肯定超過6行代碼。

那麼這些庫在哪裏?

+0

這將有助於瞭解你想要達到的目標。 – cletus 2009-02-20 07:16:16

+0

我自己沒有見過他們,但我有NIH傾向... – 2009-02-20 07:28:40

+0

我還是沒有明白道理:你想讓圖書館爲你節省6行代碼?圖書館在Javascript中的成本很高(而在C#/ Java中,你似乎擁有它們只是因爲你可以)。我不能說我曾經需要在Javascript中編寫建議。 – cletus 2009-02-20 07:35:15

回答

4

嘗試jQuery AOP plugin

看着似乎只有用了jQuery作爲一個命名空間中的source,所以你可以試試這個插件即使不想使用jQuery。

0

事實上,你已經能夠做到這一點,我認爲這意味着有一個庫以純JavaScript的形式實現它,即上面的例子。設計模式可以應用到JavaScript作爲你知道的,所以我想我會提供給你的建議是由谷歌和雅虎的GUI開發以下內容:

http://jsdesignpatterns.com/

第14章:代理模式。給你的參考解決方案。你可能仍然喜歡你的方法,或者你可以從他們的方法中找到提示。

乾杯,

安德魯

0

我不認爲你可以截取所有功能。

你能做的最好的是遍歷一個對象的所有元素,並尋找任何功能:

for elem in someObject { 
    if typeof(elem) == "function" { 
     // replace the function 
    } 
} 

麻煩的是,如果你在以後添加的功能它不是通過代理路由。