Javascript 以前使用implement注入的重构方法
您好, 我试图覆盖或扩展mootools中的元素.show()和.hide()方法,以便添加一些切换。我试着像这样使用Class.Refactor()方法:Javascript 以前使用implement注入的重构方法,javascript,mootools,Javascript,Mootools,您好, 我试图覆盖或扩展mootools中的元素.show()和.hide()方法,以便添加一些切换。我试着像这样使用Class.Refactor()方法: Element = Class.refactor(Element, { show: function(displayString) { result = this.previous(displayString); // Do my thing return result; }, hide: function()
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;
}
});
但是,这不起作用,previous为null,我认为原因是Mootools通过Element.implement注入这些方法。所以这些方法不是本地的
我已经找到了完全替换.show和.hide的方法,但我希望保留它们现有的所有功能,并添加到其中。有什么想法吗 我自己不是一个重构专家,但你总是可以“老派”地做,并将以前的函数保存在一个变量中(
\u prev\u show
和\u prev\u hide
),然后进行重写,并从新方法调用这些函数
第二种选择是尝试将元素扩展到自身并调用
this.parent()
,这是Class.Refactor的“不安全”版本 我从一位同事那里得到了答案。他不在,所以我代表他发帖,下次我们在同一个城市时会给他买啤酒:
Class.refactor在本机(元素、数组、字符串等)上不起作用
因为它们不是类,也不能被重写为类;只是
添加了一些很酷的原型,使它们更像类,更有趣,更易于使用
与……合作
扩展本地人的方法是使用implement()方法;唯一的问题
是不是这个.parent()和这个.previous()不存在,所以你必须得到一个
在不重写现有方法的情况下扩展现有方法更为棘手:
这里的关键概念是: 1-将整个shebang封装在一个私有的、自动执行的函数中 全局名称空间不受 原始方法(例如旧的隐藏和旧的显示) 2-使用本机对象的implement()方法重写每个函数, 就像您在Class.refactor的第二个参数中所做的那样 3-不是在每个方法中调用this.parent()或this.previous(),而是 使用MooTools的run()方法调用旧原型,该方法传递 参数与函数绑定并执行它 与前面一样,确保收集函数.run()调用的结果并
返回它以保持API一致性。关于ryber的最后一条评论,我感到困惑,因为我编了一个例子,就是JSFIDLE重构元素类()。
诀窍在于,当我试图在实际应用程序中使用该示例时,它不起作用,我最终在这里寻找原因。还发布了一位同事的完整示例,该示例完全按照您的建议执行。
(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