Я получил ответ от коллеги.Он не в SO, поэтому я пишу от его имени и куплю ему пиво в следующий раз, когда мы будем в том же городе:
Class.refactor не работает с Natives (Element, Array, String,и т. д.) потому что они не являются классами и не могут быть переопределены;MooTools просто добавляет несколько классных прототипов, чтобы сделать их более классными, веселыми и с ними легко работать.
Способ расширить нативы - использовать метод Implement ();Единственная проблема заключается в том, что 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 - Инкапсулировать весь shebang в частную самовыполняющуюся функцию, чтобы глобальное пространство имен не загрязнялось нашими переменными назначениями для оригинальных методов (например, old_hide и old_show);
2 - используйте метод Implement () для собственного объекта, чтобы переопределить каждую функцию, так же, как вы делали это в качестве второго аргумента Class.refactor;
3 - вместо вызова this.parent() или this.previous () в каждом методе вы вызываете старые прототипы с помощью метода run () MooTools, который передает аргументы с привязкой к функции и выполняет ее.
Как и прежде, убедитесь, чтособрать результат вызова функции.run () и вернуть его для обеспечения согласованности API.