json.stringify 不处理对象方法

2024-03-24

我正在尝试开发一个可以在大多数现代浏览器(Chrome、Firefox、IE 9+、Safari、Opera)中运行的离线 HTML5 应用程序。由于 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, not 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

我相信你们中的许多人可能已经知道这个限制/功能/无论您想如何称呼它。我想出的解决方法是使用方法创建一个对象(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不支持功能.


总而言之,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。我们只需将该数据提供给提供该方法的构造函数即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

json.stringify 不处理对象方法 的相关文章

  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何格式化 Json 输出

    请帮助我如何获取 JSON 输出 如下所示 costMethod Average fundingDate 2008 10 02 fundingAmount 2510959 95 代替 type sma costMethod Average
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery

随机推荐

  • C# 中文字的算术运算是否在编译时计算?

    非常简短的问题 但我现在无法在网上找到解决方案 int test 1 2 Will 1 2在运行时或编译时执行 询问原因 我认为大多数人有时会使用文字而不指定其使用原因或含义 因为他们不想通过运行计算来浪费一点性能 并且我相信计算发生在编译
  • 无法访问 Azure 文件共享 |端口 445

    我已经设置了 Azure 存储文件 并在我的开发计算机中添加了一些防火墙规则来打开端口 445 但我现在无法访问我的文件共享 它也不响应 ping 命令 但我可以从 Azure VM IaaS 服务器访问相同的文件共享 有什么我错过的吗 不
  • ASP.NET MVC 3 - 如何从数据库填充单选按钮列表

    在 Asp net MVC 3 中 我的单选按钮设置如下 div class editor label Html LabelFor m gt m Roles div div class editor field Html RadioButt
  • 从 iOS 14 小部件的 CoreData 获取数据

    我想在小部件中显示从核心数据获取的数据 但 FetchRequest不适用于小部件 据我了解 我们必须创建一个应用程序组并创建一个共享的持久容器 我想知道的是如何从共享的持久容器中读取 获取 小部件上的数据 或者简单地 如何在小部件中显示从
  • Sublime Text 3 控制台中的 Unicode 编码错误

    我总是得到一个 UnicodeEncodeError ascii 编解码器无法对位置 0 处的字符 xf6 进行编码 序号不在范围 128 中 当尝试打印非 ASCII 字符时 在 Sublime Text 3 控制台中 我正在使用 Ana
  • 如何使用 NetworkX 获得加权图中的最短路径?

    我试图在定义为的加权图中获得最短路径 import networkx as nx import matplotlib pyplot as plt g nx Graph g add edge 131 673 weight 673 g add
  • Sugar ORM for Android 找不到我的列名

    好吧 我正在尝试选择所有实体entitie id some id 我用这个规则来做到这一点 List
  • TinyMCE 4 与 elFinder

    有人已经尝试将 elFinder 集成到新的 4b1 版本的 TinyMCE 中吗 看起来像previous http www tinymce com wiki php how to implement a custom file brow
  • 按特定顺序对(数组)列表进行排序

    我有一个对象列表 我想按照定义的顺序对其进行排序 对于前 我有一个带有字段的对象String color 我想在颜色字段上对我的列表进行排序 以便它总是首先是白色 然后是蓝色 然后是黄色 然后是所有其他 如果可能的话 alpha order
  • 在 Java 中使用 PrinterJob 打印 PDF 文件

    我在尝试使用 Java 打印 PDF 文件时遇到问题 这是我的代码 PdfReader readFtp new PdfReader This class is used for reading a PDF file PDDocument d
  • 有什么方法可以通过某个索引将数据绑定到 data.frame 吗?

    For say I got a situation like this user id c 1 5 1 5 time c 1 10 visit log data frame user id time And I ve wrote a met
  • 在 Mono 中,如何获取 Mac (Snow Leopard) 上的 Documents 文件夹的路径?

    我正在编写一个 Mono 应用程序 并且想找到 Documents 文件夹的完整路径 例如 Users johnsmith Documents 实现这一目标的最佳方法是什么 你可以这样做 string doc path Path Combi
  • 在 Kotlin Flow 中使用 ReactiveSecurityContextHolder

    我正在使用 Kotlin 开发 Spring Boot 2 2 项目 使用 CouchDB 作为 反应式 数据库 因此使用异步 DAO 挂起函数或返回 Flow 的函数 我正在尝试设置 WebFlux 以便也拥有异步控制器 同样 我想返回
  • k8s hpa无法获取cpu信息[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我设置了 hpa 使用命令 sudo kubectl autoscale deployment e7 build 64 cpu perce
  • 使用QTWebKit显示内存中存储的网站

    目前我将 HTML JS CSS 图形等存储在本地硬盘上 并使用QWebFrame SetUrl QUrl fromLocalFile appFolder html index html 在某些时候 我需要加密本地存储的文件 因此我正在寻找
  • 如何用 PHP 可靠地发送电子邮件?

    我正在学习如何发送电子邮件 我已经安装了应用程序服务器并在文件中 php ini dist 和 php ini recommended 我做了以下更改 SMTP localhost email protected cdn cgi l ema
  • 单击按钮后将焦点置于特定 div 上

    我在页面中有一个表格 用于在特定舞台上注册各种娱乐节目 提交所有详细信息并单击提交按钮后 应检查特定日期该阶段是否存在节目 如果存在任何程序 div 应该显示现有程序的完整详细信息 我的问题是 如果存在任何程序 我需要将焦点放在新生成的 d
  • 计算热门话题

    假设我根据各种标准从 twitter 收集推文并将这些推文存储在本地 mysql 数据库中 我希望能够计算出 twitter 等热门话题 长度可以是 1 3 个单词 是否可以编写一个脚本来执行类似 PHP 和 mysql 的操作 我找到了答
  • Rust 中使用 return 语句和省略分号有什么区别?

    我正在编写一个函数 该函数在成功 和失败 时返回 serde json Value 以前在 Rust 中 我一直省略分号来从函数返回数据 如下面的代码示例所示 use serde json Result Value use core res
  • json.stringify 不处理对象方法

    我正在尝试开发一个可以在大多数现代浏览器 Chrome Firefox IE 9 Safari Opera 中运行的离线 HTML5 应用程序 由于 Safari 尚不支持 IndexedDB 并且已弃用 WebSQL 因此我决定使用 lo