我知道可以通过覆盖Storage.prototype.getItem,setItem,removeItem和clear来覆盖HTML5存储API。但是,这将覆盖本地存储和会话存储的那些方法。
是否可以覆盖一个而不是另一个?或者单独覆盖两个?
一点上下文:我有一个现有的应用程序,它大量使用本地存储和会话存储。我想添加一些临时代码来镜像另一个存储机制中的本地存储中的东西,但我不想随之拖动会话存储内容。
我可以更新对localStorage的每个引用来调用一些可以执行镜像的包装函数,但我真的不想更新所有这些调用。如果我可以通过覆盖一组存储方法来本地化这些代码,那将更加清晰。
答案 0 :(得分:10)
有几种可能性来达到你想要的效果。但请记住,它们都不应该用于生产环境。
第一个选项检测setItem
或sessionStorage
对象是否调用localStorage
方法。你可以这样写:
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);
}
}
第二个,替换sessionStorage
或localStorage
对象的原型。它可能看起来像这样:
localStorage.__proto__ = Object.create(Storage.prototype);
localStorage.__proto__.setItem = function() {
// your logic here
}
注意,我使用了__proto__
伪属性,这是非标准的,但在Chrome和Firefox中公开。 (不了解Opera,Safari等)。但是,您可以看到它在开发过程中可能会有所帮助。
答案 1 :(得分: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