假设我已经提出了一个特殊的排序函数,我想把它放在一些基于数组的对象的原型中(我将在这里使用Array)。我能做到
Array.prototype.specialSort = function...
但我真正想做的是
Array.prototype.sort.special = function...
问题当然是,当它被调用时,后者不会知道Array对象,它只会知道排序,所以它无法排序。是否有任何神奇的咒语在树上传递“这个”?
次要问题(因为主要问题的答案很可能是“不”):你会采取什么措施来实现“子方法”的概念?
答案 0 :(得分:1)
这应该与你想要的非常接近:
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);
答案 1 :(得分:0)
感谢 Pointy 和 trinithis 的指导。我想我现在对这个问题很清楚了。关键点在于,虽然sort()是Array的一个方法,但是如果它没有被调用,它只是一个成员(或属性),所以它没有“this”。如果它被调用的话我本来想要的“这个”。而且由于我在链的末尾调用某些东西,我有点希望有一些魔法可以保留所有方法。但没有。
我可能会做的是使用单独的“排序”方法来充当我的特殊方法的石斑鱼,并将现有排序单独留下。