2012-11-28 70 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