Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以前使用implement注入的重构方法_Javascript_Mootools - Fatal编程技术网

Javascript 以前使用implement注入的重构方法

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()

您好, 我试图覆盖或扩展mootools中的元素.show()和.hide()方法,以便添加一些切换。我试着像这样使用Class.Refactor()方法:

 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