11

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

是否可以只覆盖一个而不覆盖另一个?还是分别覆盖两者?

一点背景:我有一个现有的应用程序,它大量使用本地存储和会话存储。我想添加一些临时代码以将本地存储中的内容镜像到另一种存储机制中,但我不想将会话存储内容与其一起拖动。

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

4

2 回答 2

16

有几种可能性可以实现您想要的。但请记住,它们都不应该在生产环境中使用。

第一个选项检测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 等)。但是,正如您所见,它在开发过程中可能会有所帮助。

于 2012-11-28T20:22:53.847 回答
-2

是的,本地存储和会话存储在 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
于 2018-06-29T20:22:35.067 回答