在sessionStorage中保存Javascript对象

Fer*_*ora 140 javascript session-storage

SessionStorage和LocalStorage允许在Web浏览器中保存键/值对.该值必须是一个字符串,并且保存js对象并不简单.

var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过将对象序列化为JSON,然后反序列化它们来恢复对象来避免此限制.但是Storage API总是通过setItemgetItem方法传递.

sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D
Run Code Online (Sandbox Code Playgroud)

我可以避免这种限制吗?

我只是想执行这样的事情:

sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'
Run Code Online (Sandbox Code Playgroud)

我曾尝试defineGetterdefineSetter方法拦截电话,但它是一个单调乏味的工作,因为我必须定义所有属性和我的目标是不知道未来的属性.

afr*_*and 104

你能否"对字符串化"你的对象...然后sessionStorage.setItem()用来存储你的对象的字符串表示...然后当你需要它sessionStorage.getItem()然后用$.parseJSON()它来取回它?

工作示例http://jsfiddle.net/pKXMa/


小智 90

解决方案是在sessionStorage上调用setItem之前对对象进行字符串化.

var user = {'name':'John'};
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.user);
Run Code Online (Sandbox Code Playgroud)


Rya*_*lds 18

您可以使用Web Storage API提供的访问器,也可以编写包装器/适配器.从你声明的问题与defineGetter/defineSetter听起来像写一个包装器/适配器对你来说太多了.

老实说,我不知道该告诉你什么.也许你可以重新评估你对什么是"荒谬的限制"的看法.Web Storage API就是它应该是的,一个键/值存储.

  • 对不起,如果我使用了一个"荒谬"的不恰当的词.将其替换为"可能非常有趣".我认为webStorage是新网络最激动人心的改进之一.但是只保存值键映射中的字符串,我认为这是一个限制.这似乎是一个饼干的续集.我知道存储是一个不仅适用于Javascript语言的规范,但序列化对象可能是一个有趣的改进.你怎么看? (8认同)
  • 如果JSON还不够,您总是可以编写自己的对象序列化方法。 (2认同)

Abd*_*UMI 11

这是一个动态解决方案,适用于所有值类型,包括对象:

class Session extends Map {
  set(id, value) {
    if (typeof value === 'object') value = JSON.stringify(value);
    sessionStorage.setItem(id, value);
  }

  get(id) {
    const value = sessionStorage.getItem(id);
    try {
      return JSON.parse(value);
    } catch (e) {
      return value;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后 :

const session = new Session();

session.set('name', {first: 'Ahmed', last : 'Toumi'});
session.get('name');
Run Code Online (Sandbox Code Playgroud)


Abd*_*UMI 5

使用案例:

 sesssionStorage.setObj(1,{date:Date.now(),action:'save firstObject'});
 sesssionStorage.setObj(2,{date:Date.now(),action:'save 2nd object'}); 
 //Query first object
  sesssionStorage.getObj(1)
  //Retrieve date created of 2nd object
  new Date(sesssionStorage.getObj(1).date)
Run Code Online (Sandbox Code Playgroud)

API

Storage.prototype.setObj = function(key, obj) {

        return this.setItem(key, JSON.stringify(obj))
    };

    Storage.prototype.getObj = function(key) {
        return JSON.parse(this.getItem(key))
    };
Run Code Online (Sandbox Code Playgroud)

  • 我认为javascript中最好的做法之一就是不要将你不拥有的对象原型化.使用Storage.prototype.setObj似乎是一个坏主意. (3认同)
  • 只需添加强制性..确保你不添加这个原型代码 - 并且完全依赖它 - 而不首先检查浏览器是否支持它存储:`if(typeof(Storage)!=="undefined"){/*浏览器支持它*/}` (3认同)