2014-09-26 163 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