我正在尝试为localStorage.setItem()创建包装,以便我可以在整个应用程序中侦听更改。这是我现在的位置,它可以按预期运行:

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,但我需要知道何时在localStorage而不是sessionStorage上调用setItem。有没有更优雅的方式来做我需要的事情?我最初的尝试是通过执行以下操作来创建实例方法:

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


但这会导致Firefox中typeof localStorage.setItem === "string"I know, wierd right?)的错误。我不关心尝试解决这个问题,因为无论如何使用原型都会感觉更好。

最佳答案

直接检查this值:

var _setItem = Storage.prototype.setItem;

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


Live demo

10-08 16:21