Рефакторинг метода, который был ранее введен с реализацией

Поздравления, я пытаюсь переопределить или расширить Element.show () и .hide () методы в mootools для добавления некоторого переключения WAI-арии. Я пытался использовать Класс. Осуществите рефакторинг () метод как это:

 Element = Class.refactor(Element, {

 show: function(displayString) {
   result = this.previous(displayString);
   // Do my thing
   return result;
 },

 hide: function() {
   result = this.previous();
   // Do my thing
   return result;
 }

});

однако, это не работает, предыдущий является пустым, и я думаю, что причина состоит в том, что Mootools вводит те методы через Element.implement. Таким образом, методы не являются собственными?

Я выяснил, как полностью заменить .show и .hide, но я хотел бы сохранить всю их существующую функциональность и просто добавить к нему. Какие-либо идеи?

1
задан ryber 8 July 2010 в 16:33
поделиться

2 ответа

я не занимаюсь рефакторингом, но вы всегда можете сделать это «по-старому» и сохранить предыдущую функцию в переменной ( _prev_show и _prev_hide например), затем выполните переопределение и вызовите эти функции из своих новых методов.

Второй вариант - попытаться расширить Element в себя и вызвать this.parent () , это «небезопасная» версия Class.Refactor. [ссылка]

1
ответ дан 2 September 2019 в 23:12
поделиться

Я получил ответ от коллеги. Он не в SO, поэтому я пишу от его имени и куплю ему пива в следующий раз, когда мы будем в том же городе:

Class.refactor не работает с Natives (Element, Array, String и т. Д.) потому что они не Классы и не могут быть заменены; MooTools просто добавляет несколько классных прототипов, чтобы сделать их более похожими на класс, веселыми и легкими в использовании. работать с.

Способ расширения аббревиатуры - использование метода implementation (); Единственная проблема заключается в том, что this.parent () и this.previous () не существуют, поэтому вам нужно получить немного сложнее расширить существующие методы, не переписывая их:


(function(){ // Keeps the window namespace clean

   var old_hide = Element.prototype.hide;
   var old_show = Element.prototype.show;

   Element.implement({
       hide: function() {
           result = old_hide.run(arguments, this); // Calls old method
           alert("Hiding " + this.get('tag') );
           return result;
       },
       show: function(display) {
           result = old_show.run(arguments, this); // Calls old method
           alert("Showing " + this.get('tag') );
           return result;
       }
   });

})(); // Closes the private function and executes it immediately

Ключевые концепции здесь следующие:

1 - Инкапсулировать весь шебанг в частной, самовыполняющейся функции, чтобы глобальное пространство имен не загрязняется нашими присвоениями переменных для оригинальные методы (например, old_hide и old_show);

2 - Используйте метод реализации () собственного объекта, чтобы переопределить каждую функцию, так же, как вы сделали это в качестве второго аргумента Class.refactor;

3 - Вместо того, чтобы вызывать this.parent () или this.previous () в каждом методе, вы вызвать старые прототипы с помощью метода run () MooTools, который передает аргументы с привязкой к функции и выполняет ее.

Как и раньше, не забудьте собрать результат вызова function.run () и верните его, чтобы поддерживать согласованность API.

1
ответ дан 2 September 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: