我需要在JavaScript中調用一個函數。對於這一點,我在「拯救」在一個臨時變量的功能,更新了新的功能塊的目標,要求目標,然後恢復舊的功能:覆蓋和恢復功能
var myObject = {
myIntProp: 1,
myFunc: function(value) {
alert(value + 1);
}
};
myObject.myFunc(2);
var tmp = myObject.myFunc;
myObject.myFunc = function(value) {
alert(value - 1);
};
myObject.myFunc(2);
myObject.myFunc = tmp;
myObject.myFunc(2);
該作品如預期的那樣:函數被覆蓋,然後成功恢復。我的想法是這個代碼轉移到一個輔助功能,方便地使用它需要的時候:
function FunctionSwapper(target, newFunction) {
var old = target;
target = newFunction;
this.Restore = function() {
target = old;
}
};
var myObject = {
myIntProp: 1,
myFunc: function(value) {
alert(value + 1);
}
};
myObject.myFunc(2);
var swapp = new FunctionSwapper(myObject.myFunc, function(value) {
alert(value - 1);
});
myObject.myFunc(2);
swapp.Restore();
myObject.myFunc(2);
此代碼然而,不保存當前的狀態也不是更換有針對性的功能。我在這裏錯過了什麼?是不是一個函數總是作爲參考傳遞?這兩個代碼片段之間的主要區別是什麼?
(JSFiddle可用,但準備8個alert
小號......)
編輯:資深用戶已經指出,第二種方法並沒有真正從第一個不同,它可能不值得麻煩創建附加類;雖然我理解並與他們的論點同意,我看到了第二個方法有兩個優點(既適用於我特別,真實世界的情況下):
- 更容易/快寫
swapp.Restore();
比myNameSpace.level2.level3.level4.level5 = swap;
工作時與具有子元素的幾個層次和對象, - 它抽象的操作,並提供開發團隊(另外,記錄或類型打樣可以在類內完成)之間的一致的使用。
啊,你打我的15秒顯然與幾乎相同的答案! – mGuv