JavaScript原型:替换一个函数

时间:2014-08-27 10:27:24

标签: javascript

我想装饰一个JavaScript“class”(原型)的函数:

SomeClass = function() { this.someVar = 5; };

SomeClass.prototype = {
    foo: function(arg) { /* do something with this.someVar */ }
}

但是,我无法更改SomeClass的来源,也无法影响SomeClass个实例的实例创建。

因此我考虑过做以下事情:

var oldFoo = SomeClass.prototype.foo;
SomeClass.prototype.foo = function(arg) {
    console.log("Yey, decorating!");
    oldFoo(arg);
};

这似乎工作正常,但由于功能范围oldFoo无法再访问someVarthis对象现在是window)。如何克服这个问题?

1 个答案:

答案 0 :(得分:2)

您需要正确委派它。发生的事情是,因为你像一个裸函数一样调用oldFoothis值被设置为undefined(或非严格模式下的全局对象)。

使用参数应用方法并明确设置this值:

oldFoo.apply(this, arguments); // use the same `this` and same arguments as called.

请注意,为了真正正确 - 您还需要返回结果。总的来说,您的代码应该类似于:

SomeClass.prototype.foo = function(arg) {
    console.log("Yey, decorating!");
    return oldFoo.apply(this, arguments); // alternatively capture the return value
};                                        // and process it and then return it