2012-11-28 68 views
4

我知道可以通過覆蓋Storage.prototype.getItem,setItem,removeItem和clear來覆蓋HTML5存儲API。但是這將覆蓋本地存儲會話存儲的方法。是否可以在HTML5中分別覆蓋本地存儲和會話存儲?

是否可以重寫一個而不是其他?或者分別覆蓋兩者?

一點點上下文:我有一個現有的應用程序,使本地存儲和會話存儲的使用非常繁重。我想添加一些臨時代碼來鏡像另一個存儲機制中的本地存儲中的內容,但我不想拖動會話存儲內容。

我可以更新每個引用localStorage調用一些可以做鏡像的包裝函數,但我真的不想更新所有這些調用。如果我可以通過重寫一組存儲方法來本地化這些代碼,那將會更加方便。

+3

我不確定,但你試圖忽略它們的事實令人不安。 – Jeff

+0

我給這個問題增加了一些上下文。獨立於所有這一切,我也只是真正好奇:) –

回答

9

有幾種可能性來實現你想要的。但請記住,它們都不能用於生產環境。

第一個選項檢測setItem方法是否被sessionStoragelocalStorage對象調用。你可以寫這樣說:

var _setItem = Storage.prototype.setItem; 

Storage.prototype.setItem = function(key, value) { 
    if (this === window.localStorage) { 
     // do what you want if setItem is called on localStorage 
    } else { 
     // fallback to default action 
     _setItem.apply(this, arguments); 
    } 
} 

第二個,取代sessionStoragelocalStorage對象的原型。它可能看起來像這樣:

localStorage.__proto__ = Object.create(Storage.prototype); 
localStorage.__proto__.setItem = function() { 
    // your logic here 
} 

請注意,我用是非標準__proto__僞屬性,但在Chrome和Firefox暴露。 (不知道Opera,Safari等)。但是,正如您所看到的,在開發過程中可能會有所幫助。

+0

第一種選擇正是我所期待的。謝謝! –

+2

爲什麼他們不能用於生產環境? – Zim84

+0

@ Zim84因爲它們對本地對象的不可靠攻擊,並且它們可能會從一個瀏覽器版本切換到下一個版本 – oligofren