SessionStorage and LocalStorage allows to save key/value pairs in a web browser. The value must be a string, and save js objects is not trivial.
var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
Nowadays, you can avoid this limitation by serializing objects to JSON, and then deserializing them to recover the objects. But the Storage API always pass through the setItem
and getItem
methods.
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
Can I avoid this limitation?
I just want to execute something like this:
sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
I have tried the defineGetter
and defineSetter
methods to intercept the calls but its a tedious job, because I have to define all properties and my target is not to know the future properties.
This is a dynamic solution which works with all value types including objects :
Then :
Use case:
API
Either you can use the accessors provided by the Web Storage API or you could write a wrapper/adapter. From your stated issue with defineGetter/defineSetter is sounds like writing a wrapper/adapter is too much work for you.
I honestly don't know what to tell you. Maybe you could reevaluate your opinion of what is a "ridiculous limitation". The Web Storage API is just what it's supposed to be, a key/value store.
Could you not 'stringify' your object...then use
sessionStorage.setItem()
to store that string representation of your object...then when you need itsessionStorage.getItem()
and then use$.parseJSON()
to get it back out?Working example http://jsfiddle.net/pKXMa/
The solution is to stringify the object before calling setItem on the sessionStorage.