扩展Javascript类中的方法

时间:2011-04-20 15:41:59

标签: javascript icefaces prototypejs icefaces-1.8

对于那些阅读我之前发布的帖子的人来说,我是(“仍然”)在ICEFaces网络应用程序上工作。

这个问题可以解释为一般的Javascript问题,如果您对ICEFaces了解不多,请继续阅读

我需要扩展ICEFaces Javascript框架创建的类的行为,特别是ToolTipPanelPopup

我无法修改库的源代码(否则我会实现我的目标)。 这就是ICEFaces定义类的方式(很像jQuery和其他Javascript框架)。

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


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

    [...]
});

我的问题很简单

如何扩展showPopup()函数的行为以便在其结束时运行我的自定义函数?

我的意思是遵循假定继承的Java示例代码

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

1 个答案:

答案 0 :(得分: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引用的函数,然后您拥有自己的代码。如果您想在之前先执行某些操作,只需调换订单{/ 1>即可调用original。由于您正在使用闭包,original在词法上绑定到当前作用域,并且每次调用新showPopup时都应该可用(如果我对此有误,请有人纠正我)。

请告诉我这是否适合您。