2012-09-21 66 views
3

假設您有一個需要在頁面上運行的腳本來覆蓋JavaScript的JSON。 stringify,你會如何確保你的代碼使用原始的字符串而不是被覆蓋的字符串?如何在Javascript中恢復重寫函數的原始狀態

+0

運行你的代碼的其他代碼有機會修改過嗎?我嚴重懷疑你可以找到變量(或函數,在這種情況下)之前有什麼被覆蓋... – tucuxi

+1

爲什麼你需要這樣做? – Ryan

+1

http://stackoverflow.com/questions/8580431/recovering-built-in-methods-that-have-been-overwritten 似乎你可以創建一個iframe,並訪問其(全新的,未修改的)內容。另外,你的問題是這個問題的一個重複,應該像這樣關閉。 – tucuxi

回答

2

雖然我會選擇在其他答案之一,這裏的情況下的解決方案時:

  1. 無法改變,因此,
  2. 代碼不能在代碼覆蓋JSON.stringify之前運行,因此;
  3. 代碼不能保存原始函數對象(以恢復它或稍後顯式使用它)。

這裏有那麼一個黑客:

  1. 創建一個IFRAME元素。
  2. 訪問IFRAME元素的contentWindow屬性;這應該包含原始的(或「新的未觸及的」)JSON對象,並因此包含原始的JSON.stringify函數。

Here is the jsfiddle

3

如果您要創建庫,請將其作爲JSON.stringify應符合標準行爲的要求。

對您的代碼提出嚴格要求沒有任何錯誤,並且它實際上是一個好主意。你只需要確定文件的要求。

顯然,如果原件被永久覆蓋,則無法使用它。將負擔放在最終用戶上是一個更好的解決方案。

如果這不是針對圖書館,而是針對個人項目,那麼您應該簡單地拒絕加載任何第三方代碼,這些代碼會做一些愚蠢的事情,而不會像使用不合格的方法替換符合方法一樣愚蠢。

+0

+1撰寫與發佈時非常相似的內容。 –

+1

這是優雅的解決方案(「首先不要有這個問題」)。醜陋的解決方案在這裏:http://stackoverflow.com/questions/8580431/recovering-built-in-methods-that-have-been-overwritten – tucuxi

+0

不幸的是,優雅的解決方案並不總是在Javascript中的一個選項。 – w43L

1

在覆蓋之前對JSON.stringify進行備份。如果您無法對其進行備份,請使用a shiv

相關問題