gpt4 book ai didi

javascript - 如何在没有临时变量的情况下扩展方法(猴子补丁)?

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:44 24 4
gpt4 key购买 nike

我的问题的措辞一定是错误的,因为我找不到关于似乎经常出现的问题的现有问题。

我有一个类Foo

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

我有另一个类 Bar,它是用 Foo 的实例实例化的:

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:超出最大调用堆栈大小。有没有办法在没有临时变量的情况下扩展方法本身?

这是使用额外变量来完成此操作的方法:

var Bar = function (foo) {
var originala;

originala = foo.a;

foo.a = function () {
return originala.apply(this, arguments);
};

// Does something with foo.
};

最佳答案

问题:

您超出了最大调用堆栈,因为您一遍又一遍地从自身调用同一函数(递归地)。

原因:

当您构造 Foo 时,它会获得一个分配给其属性 a 的函数。一切都很好。

接下来,您构造 Bar 并尝试通过用您自己的函数替换对象上的函数来修改 Foo.a 的行为。但是,您希望在新函数体内,Foo.a 仍将包含原始函数。事实恰恰相反 - Foo.a 现在包含修改后的新函数。这就是为什么当你调用它时,它会不断调用自己,直到你点击maximum stack size limit。 .

发生这种情况是因为变量的值在执行时解析,并且您的新函数在分配给 Foo.a 后很好地执行。该对象失去了原有的功能。

解决方案:

使用prototypes 。我不会详细介绍如何使用原型(prototype)继承,因为有很多相关内容。

Note that your approach is a valid one, and frequently the only one. You simply need to keep a reference to the original function somewhere so that you can call it at a later time.

关于javascript - 如何在没有临时变量的情况下扩展方法(猴子补丁)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28150415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com