Расширение методов в классах Javascript - PullRequest
0 голосов
/ 20 апреля 2011

Я («все еще», для тех, кто читал мои предыдущие посты) работаю над веб-приложением 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 Ответ

1 голос
/ 20 апреля 2011

Как-то так должно работать:

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 (если я ошибаюсь, кто-то, пожалуйста, поправьте меня).

Дайте мне знать, если это сработает для вас.

...