【问题标题】:Extending methods in Javascript classes在 Javascript 类中扩展方法
【发布时间】:2011-04-20 15:41:58
【问题描述】:

我(“仍然”,对于那些阅读过我之前帖子的人来说)正在开发一个 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();
}

【问题讨论】:

  • 我对 Prototype 有点生疏(因此这不是答案),但我认为这就是 $super 在 Prototype 中的用途。我认为您可以将上面的代码与“$super”一起用于“super”。
  • 我可能有一个适合您问题的答案。你介意放一个jsFiddle 的例子,我可以用来做实验吗?谢谢。

标签: javascript icefaces prototypejs icefaces-1.8


【解决方案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();

萤火虫输出:

foo
foo
bar

所以这里发生的事情是您正在保存对原始 showPopup 函数的引用。然后您将创建一个闭包并将其分配回showPopup。原始的showPopup 并没有丢失,因为您在original 中仍有对其的引用。在闭包中,您调用original 引用的函数,然后您就有了自己的代码。如果您想在致电original 之前先做某事,只需交换顺序即可。由于您使用的是闭包,original 在词法上绑定到当前范围,并且每次调用新的 showPopup 时都应该可用(如果我对此有误,请有人纠正我)。

让我知道这是否适合你。

【讨论】:

  • +1 表示通用问题的正确性。现在,我的问题是在我当前的工作环境中 ToolTipPanelPopup 类不可见(但我仍然能够打开 ICE 弹出窗口)。我会调查并记住你的建议
  • @djechelon 您目前用来打开弹出窗口的机制是什么?我对 ICEFaces 不太熟悉 :)
  • 我首先在我的 JSPX 标记上声明一个填充了内容的
  • @djechelon 我想知道您是否可以用自定义组件包装该组件?然后,您可以在页面加载后覆盖该函数(在 window.onload 上放置一个处理程序)。
  • 如果您的意思是编辑 ICEFaces 源代码并重新分发它,简单的答案是我不能。我们必须使用原版库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多