2014-09-26 162 views
1

我正在嘗試爲localStorage.setItem()創建一個包裝,以便我可以在整個應用程序中偵聽更改。下面是我在哪裏,現在,它按預期工作:區分javascript構造函數的實例

var _setItem = Storage.prototype.setItem; 

Storage.prototype.setItem = function(key) { 
    localStorage.______tmp = true; 
    if(this.______tmp) { 
     delete this.______tmp; 
     localStorageObservable.notifySubscribers(key); 
    } 
    _setItem.apply(this, arguments); 
}; 

正如你可能已經猜到了,我想擺脫整個_____tmp的事情,但我需要知道什麼時候被調用的setItem localStorage而不是sessionStorage。有沒有更優雅的方式來做我需要的?我最初的嘗試是通過執行以下操作來創建一個實例方法:

var _setItem = localStorage.setItem; 
localStorage.setItem = function(key) { 
    _setItem.apply(this, arguments); 
} 

但是這會導致錯誤的Firefox其中typeof localStorage.setItem === "string"I know, wierd right?)。我不在乎試圖解決這個問題,不過因爲使用原型感覺更好。

回答

0

檢查直接this值:

var _setItem = Storage.prototype.setItem; 

Storage.prototype.setItem = function(key) { 
    if (this === localStorage) { 
     localStorageObservable.notifySubscribers(key); 
    } 
    _setItem.apply(this, arguments); 
}; 

Live demo

+0

哇,太瘋狂了簡單的解決方案是如何打擊就在有時。謝謝。 – 2014-09-26 21:13:03

+0

哈哈沒問題,花了一點時間弄清楚了。 '=]' – 2014-09-26 21:13:39