是否可以在HTML5中单独覆盖本地存储和会话存储?

问题描述 投票:4回答:2

我知道可以通过覆盖Storage.prototype.getItem,setItem,removeItem和clear来覆盖HTML5存储API。但是,这将覆盖本地存储和会话存储的那些方法。

是否可以覆盖一个而不是另一个?或者单独覆盖两个?

一点上下文:我有一个现有的应用程序,它大量使用本地存储和会话存储。我想添加一些临时代码来镜像另一个存储机制中的本地存储中的东西,但我不想随之拖动会话存储内容。

我可以更新对localStorage的每个引用来调用一些可以执行镜像的包装函数,但我真的不想更新所有这些调用。如果我可以通过覆盖一组存储方法来本地化这些代码,那将更加清晰。

javascript html5 local-storage session-storage
2个回答
10
投票

有几种可能性来实现你想要的。但请记住,它们都不应该用于生产环境。

第一个选项检测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
投票

是的,本地存储和会话存储在HTML5中单独覆盖

localStorage.setItem('name', Krishna); //here local storege value is Krishna
sessionStorage.name = "Krishna"; //here Session storege value is Krishna

在下面我们分别覆盖本地存储和会话存储值

localStorage.setItem('name', Sri); //here local storege value is Sri
sessionStorage.name = "Pal"; //here Session storege value is Pal
© www.soinside.com 2019 - 2024. All rights reserved.