2011-04-20 43 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