如何扩展没有临时variables的方法(猴子补丁)?

必须错误地表述我的问题,因为我无法find关于常见问题的现有问题。

我有一个classFoo

 var Foo = function () { return { a: function () {} }; }; 

我有一个实例化了Foo实例的另一个类Bar

 var Bar = function (foo) { // Does something with foo. }; 

我想扩展Foo实例以对Bar进行不同的工作:

 var Bar = function (foo) { foo.a = function () { return foo.a.apply(this, arguments); }; // Does something with foo. }; 

这样做,会导致RangeError: Maximum call stack size exceeded 。 有没有一种方法来扩展方法本身没有一个临时variables?

这是使用额外的variables来做到这一点的方法:

 var Bar = function (foo) { var originala; originala = foo.a; foo.a = function () { return originala.apply(this, arguments); }; // Does something with foo. }; 

问题:

你得到最大的调用堆栈超出,因为你是从自身(recursion)调用相同的function。

原因:

当你构造Foo ,它会得到一个赋值给它的属性a的函数。 一切都很好。

接下来,您将构buildBar并尝试通过用自己的方法replace对象上的函数来修改Foo.a的行为。 但是,你期望在新函数体内, Foo.a仍然会包含原始函数。 相反是真的 – Foo.a现在包含您的新的,修改的function 。 这就是为什么当你调用它时,它会一直调用自己,直到达到最大的堆栈大小限制 。

发生这种情况是因为variables的值在执行时被parsing,并且新的函数在赋值给Foo.a后被很好的执行。 原来的function是失去了这个对象。

解决scheme:

使用原型 。 我不会详细介绍使用原型inheritance,因为有大量的浮动。

请注意,你的方法是一个有效的方法,而且往往是唯一的方法。 您只需要在某处保留对原始函数的引用,以便稍后调用它。