Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在没有临时变量的情况下扩展方法(monkey patch)?_Javascript_Node.js - Fatal编程技术网

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()
    }
}