Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Работа с локальным хранилищем, как с объектом (https://javascript.ru/forum/project/28192-rabota-s-lokalnym-khranilishhem-kak-s-obektom.html)

FINoM 10.05.2012 21:18

Работа с локальным хранилищем, как с объектом
 
http://habrahabr.ru/post/143597/
Выношу на обсуждение своё небольшое изобретение для тех, кого нет на хабре и для тех, кого харит там комментировать. Здесь хотя-бы можно нормально обосрать, не боясь слива.

vadim5june 10.05.2012 22:16

Из за наличия таймера с таким объектом нужно работать специфически например насколько я понимаю его в цикл нельзя вставить

FINoM 10.05.2012 22:19

Цитата:

Сообщение от vadim5june
Из за наличия таймера с таким объектом нужно работать специфически например насколько я понимаю его в цикл нельзя вставить

Присваивать — да, в цикле не желательно. А вот получать значения вполне можно.

FINoM 10.05.2012 22:21

А хотя, чего бы нет? Взять объект, поработать с ним в цикле, а затем, после всех операций, присвоить.

devote 10.05.2012 22:33

мда, вариант интересный но не годный, например такой способ не вызовет геттер и вся твоя реализация идет прахом:
objectLocalStorage = { a: 4, b: {c: 2} };
var b = objectLocalStorage.b;
b.c = 10;
alert( objectLocalStorage.b.c ); // alert 2
Я делал что-то подобное, но отказался от этого решения из-за этого недостатка.

FINoM 10.05.2012 22:43

devote, угу, я внизу указал на это. Думаю, решение найти можно, но оно будет очень тяжелым. То есть для каждого ключа каждого подобъекта добавить геттер и хранить это всё как-нибудь.

С другой стороны, с этим объектом можно поработать, а затем присвоить туда, откуда взял. Всё же некоторая оптимизация.

FINoM 11.05.2012 03:31

Идея — говно :D
Цитата:

Несмотря на количество плюсов, которое больше нуля и количеству пользователей, добавивших статью в избранное (на текущий момент 71), считаю идею провальной и не пригодной для крупных проектов с большими объемами данных. Кроме кучи очевидных минусов, описанных в статье, есть менее очевидный минус, касающийся производительности. Каждый раз, когда вы запрашиваете или меняете данные в объекте-хранилище, вызывается стрингификация объекта, затем проверка, равна ли полученная строка значению из localStorage, затем, если проверка вернула ложь, строка отправляется в localStorage. Если какой-либо элемент объекта хранилища перебирать в цикле, эта операция будет происходить на каждой итерации, даже если банально инкрементируется какое-нибудь число из объекта.

Предлагаю относиться к этой статье, как к некоему эксперименту, никак не упрощающему веб разработку и, при повседневном использовании идущем ей во вред.

Gvozd 11.05.2012 03:57

Цитата:

Сообщение от FINoM
есть менее очевидный минус, касающийся производительности.

Так не покатит?
if(timer == null) {
            timer = setTimeout( function(){
                var stringified = JSON.stringify( _objectLocalStorage );
                // некое подобие оптимизации: если данные в объекте не изменились,
                // значит присваивания никакого не было, сработал обычный гет
                if( stringified !== localStorage.getItem( 'objectStorage' ) ) {
                    // сохраняем 
                    localStorage.setItem( 'objectStorage', stringified );
                }
                timer = null;
            }, 0);
        }

FINoM 11.05.2012 04:27

Цитата:

Сообщение от Gvozd
Так не покатит?

Дай-ка подумать... Значит, во-первых, не вызывается этот кошмар при каждой итерации, во-вторых, не будет «перебоя» новых данных старыми, что являлось следствием асинхронности. Вариант. Очень даже не плохой, на сонную голову.

devote 11.05.2012 04:29

Цитата:

Сообщение от Gvozd
if(timer != null) {

дык может не != а все же ==
не?


Часовой пояс GMT +3, время: 07:44.