2011-04-20 44 views
0

我對ICEFaces網絡應用程序的工作(對於那些閱讀我以前的帖子的人來說「仍然」)。Javascript類中的擴展方法

這個問題可以理解爲一般的JavaScript的問題,所以閱讀,如果你不知道很多關於ICEFaces的

我需要延長的ICEFaces的JavaScript框架創建的類的行爲,特別是ToolTipPanelPopup

我不能修改庫的源代碼(否則我會達到我的目標)。 這就是ICEFaces定義類的方式(很像jQuery和其他Javascript框架)。

ToolTipPanelPopup = Class.create({ 
    [...] 
    showPopup: function() { 
    [...] 
    }, 


    updateCordinate: function(event) { 
    [...] 
    }, 

    [...] 
}); 

我的問題很簡單

如何擴展,以便在它結束時運行我的自定義功能showPopup()功能的行爲?

我的意思是像下面的Java示例代碼,假設繼承

public void ShowPopup() 
{ 
    super.ShowPopup(); 
    customMethod(); 
} 
+0

我在Prototype上有些生疏(因此這不是答案),但是我認爲這就是Prototype中的$ super。我*認爲*您可以使用'$ super'代替'super'代碼。 – 2011-04-20 16:23:29

+0

我可能有一個適合您的問題的答案。你會介意把一個[jsFiddle](http://jsfiddle.net/)的例子用於實驗嗎?謝謝。 – Paolo 2011-04-20 16:49:25

回答

1

像這樣的東西應該工作:

var original = ToolTipPanel.showPopup; 
ToolTipPanel.showPopup = function() { 
    original(); //this is kind of like the call to super.showPopup() 
    //your code 
}; 

我嘗試了在Firebug這個簡單的例子,它似乎工作:

var obj = { 
    func: function() { 
    console.log("foo"); 
    } 
}; 

obj.func(); 

var original = obj.func; 
obj.func = function() { 
    original(); 
    console.log("bar"); 
}; 

obj.func(); 

Firebug輸出:

foo 
foo 
bar 

所以這裏發生了什麼是您保存對原始showPopup函數的引用。然後你創建一個閉包並將其分配回showPopup。原始showPopup不會丟失,因爲您仍然在original中提及它。在關閉中,您調用original引用的函數,然後您擁有自己的代碼。如果您想先做點什麼,然後在之前撥打original即可。由於您使用的是閉包,因此original在詞彙上與當前作用域綁定,並且每次調用新的showPopup時都應該可用(如果我錯了,請指正我)。

讓我知道這是否適合你。

+0

+1爲正確的通用問題。現在,我的問題是,在我目前的工作環境中,ToolTipPanelPopup類不可見(但我仍然能夠打開ICE彈出窗口)。我會調查並記住你的建議 – 2011-04-20 16:42:15

+0

@djechelon當前用於打開彈出窗口的機制是什麼?我不熟悉ICEFaces :) – 2011-04-20 17:17:19

+0

我首先聲明一個填充了我的JSPX標記內容的 2011-04-21 07:47:52