当前位置: 首页 > 面试题库 >

json.stringify不处理对象方法

曹鸿风
2023-03-14
问题内容

我正在尝试开发一个脱机HTML5应用程序,该应用程序应可在大多数现代浏览器(Chrome,Firefox,IE 9
+,Safari,Opera)中使用。由于Safari目前尚未支持IndexedDB,并且不建议使用WebSQL,因此我决定使用localStorage来存储用户生成的JavaScript对象和JSON.stringify()/
JSON.parse()放入或取出对象。但是,我发现这JSON.stringify()不能处理方法。这是带有简单方法的示例对象:

    var myObject = {};
    myObject.foo = 'bar';
    myObject.someFunction = function () {/*code in this function*/}

如果我对此对象进行字符串化(然后将其放入localStorage中),则将保留的全部myObject.foo不是myObject.someFunction()

    //put object into localStorage
    localStorage.setItem('myObject',JSON.stringify(myObject));

    //pull it out of localStorage and set it to myObject
    myObject = localStorage.getItem('myObject');

    //undefined!
    myObject.someFunction

我敢肯定,你们中的许多人可能已经知道此限制/功能/无论您想称它什么。我想出的解决方法是使用method(myObject = new objectConstructor())创建一个对象,从localStorage中提取对象属性,并将其分配给我创建的新对象。我觉得这是一种回旋的方法,但是我是JavaScript世界的新手,所以这就是我解决的方法。所以这是我的主要问题:我希望将整个对象(属性+方法)包含在localStorage中。我该怎么做呢?如果您可以向我展示一个更好的算法,或者另一个我不知道的JSON方法,我将不胜感激。


问题答案:

javascript中的函数不仅仅是其代码。他们也有范围。代码可以字符串化,但作用域不能。

JSON.stringify()将对JSON支持的值进行编码。值可以是对象,数组,字符串,数字和布尔值的对象。其他任何事情都将被忽略或引发错误。JSON不支持函数。JSON仅处理纯数据,功能不是数据,而是具有更复杂语义的行为。

也就是说,您可以更改JSON.stringify()工作方式。第二个参数是一个replacer函数。因此,您可以通过强制功能分层来强制实现所需的行为:

var obj = {
  foo: function() {
    return "I'm a function!";
  }
};

var json = JSON.stringify(obj, function(key, value) {
  if (typeof value === 'function') {
    return value.toString();
  } else {
    return value;
  }
});

console.log(json);
// {"foo":"function () { return \"I'm a function!\" }"}

但是,当您读回该内容时,您将必须评估函数字符串并将结果设置回该对象,因为JSON 不支持functions

JSON中的所有编码功能总会让人毛骨悚然。你确定你要这么做吗?可能有更好的方法…

也许您可以保存原始数据,然后将其从页面上加载的JS传递给构造函数。localStorage只会保存数据,但是加载到页面上的代码将提供对这些数据进行操作的方法。

// contrived example...

var MyClass = function(data) {
  this.firstName = data.firstName;
  this.lastName = data.lastName;
}

MyClass.prototype.getName() {
  return this.firstName + ' ' + this.lastName;
}

localStorage.peopleData = [{
  firstName: 'Bob',
  lastName:  'McDudeFace'
}];

var peopleData = localStorage.peopleData;

var bob = new MyClass(peopleData[0]);
bob.getName() // 'Bob McDudeFace'

我们不需要将getName()方法保存到localStorage。我们只需要将数据馈送到提供该方法的构造函数中即可。



 类似资料:
  • 问题内容: 我需要一个从任何参数构建JSON有效字符串的函数,但: 通过不两次添加对象来避免递归问题 通过截断给定深度来避免调用堆栈大小问题 通常,它应该能够处理大对象,但要以截断为代价。 作为参考,此代码失败: 避免递归问题很简单: 但是到目前为止,除了复制和更改Douglas Crockford的代码 以跟踪深度之外,我还没有找到任何方法来避免在诸如或any之类的非常深的对象上发生堆栈溢出。有

  • 问题内容: 我的应用程序包含大量对象,我将它们进行字符串化并将其保存到磁盘。不幸的是,当数组中的对象被操纵并且有时被替换时,对象上的属性以不同的顺序列出(它们的创建顺序?)。当我在数组上执行JSON.stringify()并将其保存时,一个diff显示以不同顺序列出的属性,当尝试使用diff和合并工具进一步合并数据时,这很烦人。 理想情况下,我想在执行字符串化之前或作为字符串化操作的一部分,按字母

  • 本文向大家介绍操作JSON.stringify()方法时,如何不删除对象内部的函数?,包括了操作JSON.stringify()方法时,如何不删除对象内部的函数?的使用技巧和注意事项,需要的朋友参考一下 JSON.stringify()方法不仅对对象进行字符串化 ,而且还删除了在该对象内部发现的所有函数 。因此,要使该函数 不被删除, 应将其转换为字符串,然后仅应使用JSON.stringify(

  • 本文向大家介绍jquery处理json对象,包括了jquery处理json对象的使用技巧和注意事项,需要的朋友参考一下 在服务器端的php脚本: jquery脚本: 返回到js后的处理: 第一种要用到varl转化的:是字符串的时候就要用eval转化成jquery对象(如下) 第二种:不需要转化的: 循环也有两种方法:

  • 在 Redis 的命令中,用于对键(key)进行处理的命令占了很大一部分, 而对于键所保存的值的类型(后简称“键的类型”),键能执行的命令又各不相同。 比如说, LPUSH 和 LLEN 只能用于列表键, 而 SADD 和 SRANDMEMBER 只能用于集合键, 等等。 另外一些命令, 比如 DEL 、 TTL 和 TYPE , 可以用于任何类型的键, 但是, 要正确实现这些命令, 必须为不同类

  • 本文向大家介绍JavaScript对象数组的排序处理方法,包括了JavaScript对象数组的排序处理方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript对象数组的排序处理方法。分享给大家供大家参考,具体如下: javascript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列。 arrayobj.sort(sortfunction); 参数: