代码之家  ›  专栏  ›  技术社区  ›  ryber

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

  •  1
  • ryber  · 技术社区  · 14 年前

    问候语,

     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,但我想保留所有现有的功能,只是添加到它。有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   gonchuki    14 年前

    我自己不是一个重构的人,但你总是可以“老派”地做,把前面的函数保存在一个变量中( _prev_show _prev_hide

    第二种选择是尝试将元素扩展到自身并调用 this.parent() ,这是Class.Refactor的“不安全”版本。 [reference]

        2
  •  1
  •   ryber    14 年前

    重构在本机(元素、数组、字符串等)上不起作用 因为它们不是类,也不能重写为类;MooTools只是

    扩展natives的方法是使用implement()方法;唯一的问题 在不重写现有方法的情况下扩展现有方法有点困难:


    (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封装在一个私有的、自动执行的函数中 全局名称空间没有被我们为 原始方法(如旧的隐藏和旧的显示);

    就像你作为Class.refactor的第二个参数所做的那样;

    3-不是在每个方法中调用this.parent()或this.previous(),而是 使用MooTools的run()方法调用旧原型,该方法传递

    返回它以保持API一致性。

        3
  •  0
  •   PaquitoSoft    14 年前

    关于ryber的最后一条评论,我很困惑,因为我编了一个例子是JSFIDLE重构元素类( Sample ).