Поздравления, я пытаюсь переопределить или расширить 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, но я хотел бы сохранить всю их существующую функциональность и просто добавить к нему. Какие-либо идеи?
я не занимаюсь рефакторингом, но вы всегда можете сделать это «по-старому» и сохранить предыдущую функцию в переменной ( _prev_show
и _prev_hide
например), затем выполните переопределение и вызовите эти функции из своих новых методов.
Второй вариант - попытаться расширить Element в себя и вызвать this.parent ()
, это «небезопасная» версия Class.Refactor. [ссылка]
Я получил ответ от коллеги. Он не в 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.