Javascript 如何在没有临时变量的情况下扩展方法(monkey patch)?
一定是我的问题措辞错误,因为我找不到关于似乎经常发生的问题的现有问题 我有一门课Javascript 如何在没有临时变量的情况下扩展方法(monkey patch)?,javascript,node.js,Javascript,Node.js,一定是我的问题措辞错误,因为我找不到关于似乎经常发生的问题的现有问题 我有一门课Foo var Foo = function () { return { a: function () {} }; }; 我有另一个类Bar,它是用Foo的实例实例化的: var Bar = function (foo) { // Does something with foo. }; 我想扩展Foo实例,使其在Bar中以不同的方式工作: var Bar = funct
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
现在包含您新修改的函数。这就是为什么当你调用它时,它会一直调用自己,直到你遇到一个错误
这是因为变量的值在执行时被解析,并且新函数在分配给Foo.a
后执行良好。此对象的原始函数已丢失
解决方案:
使用。我不会详细讨论使用原型继承,因为到处都有很多
请注意,您的方法是有效的,而且通常是唯一的方法。您只需要在某个地方保留对原始函数的引用,以便以后可以调用它
这在使用时变得非常容易
6年前提出这个问题时,大多数浏览器(如果有的话)都不可能做到这一点,但是。为什么不使用临时变量呢?更好的是,你想用这个来完成什么?这似乎有点可疑。扩展原型将影响
Foo
的所有实例。我正在修补foo
的现有实例,以使其在特定域中表现不同。这是对问题的准确解释。我希望有一种名称引用可以避免临时变量。你可以把普通函数放到原型中,然后每个实例使用monkey补丁。您也可以使用命名函数,但为了访问它,您需要在类之外定义它,在我看来,这可能看起来很难看。。。
class Foo {
a(){
return /* Something */
}
}
class Bar extends Foo {
a(){
/* Do something else */
return super.a()
}
}