2014-08-27 84 views
1

我想裝飾一個JavaScript「類」的功能(原型):JavaScript的原型:更換功能

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)。如何解決這個問題?

回答

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