我想装饰一个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
无法再访问someVar
(this
对象现在是window
)。如何克服这个问题?
答案 0 :(得分:2)
您需要正确委派它。发生的事情是,因为你像一个裸函数一样调用oldFoo
,this
值被设置为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