在 sessionStorage 中保存 Javascript 对象

新手上路,请多包涵

SessionStorage 和 LocalStorage 允许在 Web 浏览器中保存键/值对。值必须是字符串,保存js对象不是小事。

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

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

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

我可以避免这个限制吗?

我只想执行这样的事情:

 sessionStorage.user.name; // 'John'
 sessionStorage.user.name = 'Mary';
 sessionStorage.user.name // 'Mary'

我已经尝试过 defineGetterdefineSetter 方法来拦截调用,但这是一项乏味的工作,因为我必须定义所有属性,而我的目标是不知道未来的属性。

原文由 Ferran Basora 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 953
2 个回答

您可以使用 Web Storage API 提供的访问器,也可以编写包装器/适配器。从您声明的defineGetter/defineSetter问题来看,编写包装器/适配器对您来说工作量太大。

老实说,我不知道该告诉你什么。也许您可以重新评估您对“可笑限制”的看法。 Web Storage API 正是它应有的样子,一个键/值存储。

原文由 Ryan Olds 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以创建 2 个包装器方法来从会话存储中保存和检索对象。

 function saveSession(obj) {
 sessionStorage.setItem("myObj", JSON.stringify(obj));
 return true;
 }

 function getSession() {
 var obj = {};
 if (typeof sessionStorage.myObj !== "undefined") {
 obj = JSON.parse(sessionStorage.myObj);
 }
 return obj;
 }

像这样使用它:- 获取对象,修改一些数据,然后保存回来。

 var obj = getSession();

 obj.newProperty = "Prod"

 saveSession(obj);

原文由 GorvGoyl 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题