一个方法可以找出其父对象的“this”吗?

时间:2010-07-21 23:32:41

标签: javascript

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

Array.prototype.specialSort = function...

但我真正想做的是

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

问题当然是,当它被调用时,后者不会知道Array对象,它只会知道排序,所以它无法排序。是否有任何神奇的咒语在树上传递“这个”?

次要问题(因为主要问题的答案很可能是“不”):你会采取什么措施来实现“子方法”的概念?

2 个答案:

答案 0 :(得分:1)

这应该与你想要的非常接近:

Array.prototype.sort = function () {
  return {
      self: this;
    , special: function () {
        return sortLogic (self);
      }
  };
};

var xs = [1, 2, 3];
xs.sort ().special ();

另一种选择是使用Function.prototype.callFunction.prototype.apply,特别是如果您希望arr.sort ()正常对列表进行排序。

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

在第一种方法上使用第二种方法可以轻松地在call方法上使用applysort.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);

答案 1 :(得分:0)

感谢 Pointy trinithis 的指导。我想我现在对这个问题很清楚了。关键点在于,虽然sort()是Array的一个方法,但是如果它没有被调用,它只是一个成员(或属性),所以它没有“this”。如果它被调用的话我本来想要的“这个”。而且由于我在链的末尾调用某些东西,我有点希望有一些魔法可以保留所有方法。但没有。

我可能会做的是使用单独的“排序”方法来充当我的特殊方法的石斑鱼,并将现有排序单独留下。