代码之家  ›  专栏  ›  技术社区  ›  Roy J

一个方法能找出它的父对象的“this”吗?

  •  3
  • Roy J  · 技术社区  · 14 年前

    假设我已经提出了一个特殊的排序函数,我想把它放在一些基于数组的对象的原型中(这里我将使用数组本身)。我能做到

    Array.prototype.specialSort = function...
    

    但我真正想做的是

    Array.prototype.sort.special = function...
    

    当然,问题是当它被调用时,后者不知道数组对象,它只知道排序,所以不能排序。有什么神奇的咒语可以把这个传下去吗?

    第二个问题(因为对主要问题的回答很可能是“不”):你会怎样做以最优雅的方式实现“子方法”的概念?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Thomas Eding    14 年前

    这应该相当接近你想要的:

    Array.prototype.sort = function () {
      return {
          self: this;
        , special: function () {
            return sortLogic (self);
          }
      };
    };
    
    var xs = [1, 2, 3];
    xs.sort ().special ();
    

    另一种选择是 Function.prototype.call Function.prototype.apply ,尤其是如果你想 arr.sort () 将列表按正常顺序排序。

    Array.prototype.sort.special.call (arr, arg1, arg2, etc);
    

    在第一个方法上使用第二个方法允许使用 call apply 方法很容易 sort.special 方法。在执行以下操作时可能有用:

    function () {
      Array.prototype.sort.special.call (arguments);
    }
    

    如果你想要两个世界,像这样的事情可以奏效:

    Array.prototype.sort = (function () {
      var special = function () {
        if (this [0] > this [1]) {
          var tmp = this [0];
          this [0] = this [1];
          this [1] = tmp;
        }
        return this;
      };
      var sort = function () {
        var context = this;
        return {
          special: function () {
            return special.apply (context, arguments)
          }
        };
      };
      sort.special = special;
      return sort;
    }) ();
    
    
    /*** Example Below ***/
    
    
    function foo () {
      Array.prototype.sort.special.call (arguments);
      var xs = [5, 2, 3];
      xs.sort ().special ();
      alert (arguments);
      alert (xs);
    }
    
    foo (9, 6);
    
        2
  •  0
  •   Roy J    14 年前

    谢谢你们的指导 尖尖的 三位一体 . 我想我现在对这个问题很清楚了。关键是,尽管sort()是数组的一个方法,但如果它没有被调用,它只是一个成员(或属性),所以它没有“this”。我想要的是“这个”,如果它被调用的话。既然我在召唤 某物 在链条的末端,我有点希望有一些魔法能让它保持方法y。但是没有。

    我可能会有一个单独的“排序”方法来作为我的特殊方法的石斑,并离开现有的排序单独。