2011-02-18 29 views
5

我在這裏寫一些書籤,我有一些問題與內置的JavaScript函數有關。非遞歸替換內置的JavaScript函數

比方說,我想要替換內置的提示功能(不一定在書籤)。這似乎很容易,但有沒有辦法從這個替換內部調用內置提示符函數?

prompt = function(message){ 
    var tmp = prompt(message); 
    hook(tmp); 
    return tmp; 
} 

我無法確定正確的範圍,這個例子產生無限遞歸。

還有一種方法可以恢復已被替換的內置JavaScript函數的默認行爲(不掛在額外的引用上)。

+0

縮進線。 – nyuszika7h 2011-02-18 18:46:18

回答

6
(function() { 
    var old_prompt = prompt; 
    prompt = function (msg) { 
     var tmp = old_prompt(msg); 
     hook(tmp); 
     return tmp; 
    }; 
    prompt.restore = function() { prompt = old_prompt; } 
    // analogous for other functions you want to replace 
})(); 

在(自動執行)函數結束工作確保old_prompt不會泄漏到外部。你需要暴露東西雖然。爲了方便起見,我選擇提供恢復功能,可能會說,面向未來和封裝。只要更高階的函數避免擺弄別人的範圍...

另外,不,它是(我會假設)不可能恢復變量的前一個值沒有任何引用它(舊值),即使這個值恰好是內置的。即使有可能,這也是一個非常模糊的竅門 - 這種方式很有效,所以讓我們堅持下去。如果你想輸入代碼

(貸記func.restore去的Martijn)由4位

+0

在附註中,我在Lua中更常見到了這個技巧(感謝`do ... end`塊更容易 - 有自己的範圍,但立即執行一次,所以它最終只是更多比一個更好看的自我執行功能)。 – delnan 2011-02-18 18:45:34