10.05.2012, 21:18
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Работа с локальным хранилищем, как с объектом
http://habrahabr.ru/post/143597/
Выношу на обсуждение своё небольшое изобретение для тех, кого нет на хабре и для тех, кого харит там комментировать. Здесь хотя-бы можно нормально обосрать, не боясь слива.
|
|
10.05.2012, 22:16
|
|
Студент
|
|
Регистрация: 30.04.2012
Сообщений: 1,113
|
|
Из за наличия таймера с таким объектом нужно работать специфически например насколько я понимаю его в цикл нельзя вставить
|
|
10.05.2012, 22:19
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от vadim5june
|
Из за наличия таймера с таким объектом нужно работать специфически например насколько я понимаю его в цикл нельзя вставить
|
Присваивать — да, в цикле не желательно. А вот получать значения вполне можно.
|
|
10.05.2012, 22:21
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
А хотя, чего бы нет? Взять объект, поработать с ним в цикле, а затем, после всех операций, присвоить.
|
|
10.05.2012, 22:33
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
мда, вариант интересный но не годный, например такой способ не вызовет геттер и вся твоя реализация идет прахом:
objectLocalStorage = { a: 4, b: {c: 2} };
var b = objectLocalStorage.b;
b.c = 10;
alert( objectLocalStorage.b.c ); // alert 2
Я делал что-то подобное, но отказался от этого решения из-за этого недостатка.
Последний раз редактировалось devote, 10.05.2012 в 22:45.
|
|
10.05.2012, 22:43
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
devote, угу, я внизу указал на это. Думаю, решение найти можно, но оно будет очень тяжелым. То есть для каждого ключа каждого подобъекта добавить геттер и хранить это всё как-нибудь.
С другой стороны, с этим объектом можно поработать, а затем присвоить туда, откуда взял. Всё же некоторая оптимизация.
|
|
11.05.2012, 03:31
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Идея — говно
Цитата:
|
Несмотря на количество плюсов, которое больше нуля и количеству пользователей, добавивших статью в избранное (на текущий момент 71), считаю идею провальной и не пригодной для крупных проектов с большими объемами данных. Кроме кучи очевидных минусов, описанных в статье, есть менее очевидный минус, касающийся производительности. Каждый раз, когда вы запрашиваете или меняете данные в объекте-хранилище, вызывается стрингификация объекта, затем проверка, равна ли полученная строка значению из localStorage, затем, если проверка вернула ложь, строка отправляется в localStorage. Если какой-либо элемент объекта хранилища перебирать в цикле, эта операция будет происходить на каждой итерации, даже если банально инкрементируется какое-нибудь число из объекта.
Предлагаю относиться к этой статье, как к некоему эксперименту, никак не упрощающему веб разработку и, при повседневном использовании идущем ей во вред.
|
|
|
11.05.2012, 03:57
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от FINoM
|
есть менее очевидный минус, касающийся производительности.
|
Так не покатит?
if(timer == null) {
timer = setTimeout( function(){
var stringified = JSON.stringify( _objectLocalStorage );
// некое подобие оптимизации: если данные в объекте не изменились,
// значит присваивания никакого не было, сработал обычный гет
if( stringified !== localStorage.getItem( 'objectStorage' ) ) {
// сохраняем
localStorage.setItem( 'objectStorage', stringified );
}
timer = null;
}, 0);
}
Последний раз редактировалось Gvozd, 11.05.2012 в 04:30.
Причина: исправлена опечатка
|
|
11.05.2012, 04:27
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от Gvozd
|
Так не покатит?
|
Дай-ка подумать... Значит, во-первых, не вызывается этот кошмар при каждой итерации, во-вторых, не будет «перебоя» новых данных старыми, что являлось следствием асинхронности. Вариант. Очень даже не плохой, на сонную голову.
|
|
11.05.2012, 04:29
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от Gvozd
|
if(timer != null) {
|
дык может не != а все же ==
не?
|
|
|
|