- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题有一些评论对重建对象的概念持低估态度。评论者无法或不愿解释他们认为这是个坏主意的原因,但自从问过之后我得出了同样的结论。原因如下。
如果您考虑 MVVM,拥有模型和 View 模型的目的是将行为与数据分开。这有点有趣,因为面向对象的要点就是将它们结合起来。但在分布式世界中,数据必须四处传输。如果您的代码和数据全部混在一起,那么您必须发明 MVVM 或继续解构和重构对象。
分解和重建对象的代码是您不需要的测试和维护时间槽,并引入了两种故障模式。不要这样做。有一个无方法类来保存状态和一个在无方法类上运行的无状态类。这就是 MVVM 的本质,实际上只不过是 Memento 模式的应用。
Memento (283) Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
Design Patterns, Gamma et al, 1995
我的 View 模型的数据以 JSON 格式在客户端 JS 和服务器 Web API 之间来回传递。
众所周知,JSON.stringify(object)
仅序列化具有非 null 值且不是 Function
的成员。因此,JSON.parse(JSON.stringify(someObject))
将从对象中删除所有方法。
我当前的实现是将每个图节点实现为具有序列化和反序列化方法的 Typescript 类。 JQuery.ajax 调用 Web API 并将生成的 JSON 隐式解析为对象定义的 DAG,每个对象定义都有一个 Type 属性,指示它在序列化之前是哪种类型的类。我有一个按名称索引的构造函数映射,检索适当的构造函数并将数据作为构造函数参数传递。
根据类型可能有 child ;如果是这样,事情将递归地向下进行。
我一直在想,除了复制所有属性值,我是否不能只分配一个合适的原型(prototype)。把山带给穆罕默德,你可能会说。这将消除我的代码库中的相当多的困惑。
在我写的时候,我突然想到我可以使用 $.extend,但是我正在逐步从我的代码库中剔除 jQuery ,所以这将是倒退的一步。
在评论中观察到,分配原型(prototype)意味着永远不会调用构造函数。这无关紧要。对象状态已经设置,所需要的只是使方法可用。
最佳答案
我最近使用可以序列化然后重构内容的方法构建对象。
我只是添加了一个参数,它可以接受一个 JSON 对象并将其分配给自己。
使用普通对象的例子:
function myObject() {
this.valueA = 1;
this.valueB = 2;
this.valueC = 3;
this.add = function() {
return this.valueA + this.valueB + this.valueC;
};
}
var o = new myObject();
console.log(o.add());
console.log(JSON.stringify(o));
如果你序列化这个你会得到:
{"valueA":1,"valueB":2,"valueC":3}
现在,要重构它,您可以像这样向对象添加一个 Object.assign()
,获取参数并将其与 self 合并:
function myObject(json) {
this.valueA = 0;
this.valueB = 0;
this.valueC = 0;
this.add = function() {
return this.value1 + this.value2 + this.value3;
};
Object.assign(this, json); // will merge argument with itself
}
如果我们现在将解析后的 JSON 对象作为参数传递,它将自身与重新创建您所拥有的对象合并:
var json = JSON.parse('{"valueA":1,"valueB":2,"valueC":3}')
function myObject(json) {
this.valueA = 0;
this.valueB = 0;
this.valueC = 0;
this.add = function() {
return this.valueA + this.valueB + this.valueC;
};
Object.assign(this, json); // will merge argument with itself
}
var o = new myObject(json); // reconstruct using original data
console.log(o.add());
如果您现在通过数组拥有 child ,您只需沿着链向下递归地重复该过程。
(一个好处是您也可以通过这种方式传递选项)。
关于javascript - 从 JSON 重构 JS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45687771/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!