Можно ли отдельно переопределить локальное хранилище и хранилище сеансов в HTML5?

Я знаю, что можно переопределить API-интерфейсы хранилища HTML5, переопределив Storage.prototype.getItem, setItem, removeItem и clear. Но это переопределит эти методы как для локального хранилища , так и для хранилища сеансов.

Можно ли просто переопределить одно, а не другое? Или переопределить оба по отдельности?

Небольшой контекст: у меня есть существующее приложение, которое очень интенсивно использует как локальное хранилище, так и хранилище сеансов. Я хочу добавить некоторый временный код для отражения содержимого локального хранилища в другом механизме хранения, но я не хочу перетаскивать содержимое хранилища сеанса вместе с ним.

Я мог бы обновить каждую ссылку на localStorage, чтобы вызвать какую-нибудь функцию-оболочку, которая могла бы выполнять зеркальное отображение, но я действительно не хочу обновлять все эти вызовы. Было бы намного чище, если бы я мог локализовать этот код, переопределив один набор методов хранения.


person Dan M    schedule 28.11.2012    source источник
comment
Я не уверен, но тот факт, что вы вообще пытаетесь их переопределить, настораживает.   -  person Jeff    schedule 28.11.2012
comment
Я добавил некоторый контекст к вопросу. Вне зависимости от всего этого, мне также просто искренне любопытно :)   -  person Dan M    schedule 28.11.2012
comment
Другой причиной могут быть проблемы с конфиденциальностью (подумайте о баннерах согласия на использование файлов cookie GDPR). Поскольку локальное хранилище сопоставимо с файлами cookie. Если пользователь отказывается от всех файлов cookie, то в этом случае я хочу, чтобы все вызовы localStorage.setItem() ничего не делали. Переопределение этих методов в центральном месте может быть проще и позволяет избежать касания нескольких мест в вашем коде.   -  person Christoph    schedule 19.08.2020


Ответы (2)


Есть несколько возможностей достичь желаемого. Но помните, ни один из них не должен использоваться в производственной среде.

Первая опция определяет, был ли метод 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. (Не знаю про Оперу, Сафари и другие). Однако, как вы можете видеть, это может быть полезно во время разработки.

person dreame4    schedule 28.11.2012
comment
Первый вариант как раз то, что я искал. Спасибо! - person Dan M; 29.11.2012
comment
Почему их нельзя использовать в продуктивной среде? - person Zim84; 24.11.2015
comment
@Zim84 Zim84 Потому что это ненадежные взломы нативных объектов, и они могут сломаться от одной версии браузера к другой. - person oligofren; 13.07.2016

Да, локальное хранилище и хранилище сеансов переопределяются отдельно в HTML5.

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

Ниже мы отдельно переопределяем значение Local Storage и Session Storage.

localStorage.setItem('name', Sri); //here local storege value is Sri
sessionStorage.name = "Pal"; //here Session storege value is Pal
person Srikrushna    schedule 29.06.2018
comment
вы ответили совсем на другой вопрос - person quetzalcoatl; 01.07.2019