- 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/
是否有任何特定于 CoffeeScript 的技巧可以使这看起来更整洁: index = (-> if segment == 'index' return
我正在试验 C# 的不同领域并重构最佳实践/模式。 可以看出,下面的 Validate 方法有 3 个子验证方法。 有没有办法重新设计/重构此方法,以便删除 if 语句? (可能使用委托(delega
我正在制作一个简单的 Rails 站点,它将存储一些日期并执行基本的条件检查。我在下面写了一些方法,并被告知我可以使它们更有效率。我一直挠头,我不知道该怎么做。我应该让 entry.find 全局化吗
有没有更好的方法来编写这个函数?我继承了一些 javascript 代码,如果可能的话,我想让它更简洁。此外,我可能会添加更多“主题”元素,并且不想一遍又一遍地复制和粘贴。 function imag
1. 效果展示 在线查看 2. 开始前说明 效果实现参考源码: Logo 聚集与散开 原效果代码基于 react jsx 类组件实现。依赖旧,代码冗余。
我似乎缺乏足够的咖啡来让我清楚地看到以下问题。 假设我有一个包含两个构造函数和多个字段的类。一个构造函数是无参数构造函数,一个字段依赖于另一个字段。另一个构造函数为其其中一个字段获取注入(inject
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个枚举,里面有一些状态: enum State { A, B, C, D } 以及具有相应状态的对象: class MyObject { State st
我的 build.xml 中有这段代码:
在Delphi XE中,我经常使用重命名变量重构(Ctrl+Shift+E),通过给出更有意义的变量名称来使我的代码更容易理解,例如: 这一切都很好,但是当我使用它时,我在工作空间方面遇到了一个小问题
我实现了一个逻辑来通过data变量计算剩余数量和成本。它循环遍历每个产品,并通过计算已返回数量状态的数量来计算剩余数量,并减去产品数量。 有没有办法重构这段代码,使其看起来更干净、易于理解/可维护?我
我正在学习 Haskell,所以这可能是一些非常微不足道的事情,但我希望得到一些关于如何重写它以及它如何工作的指示。 我有以下工作代码(使用的包: HTF 、 Parsec 和 Flow ): {-#
我有以下代码: switch(equipmentAttachment.AttachmentPosition) { case 'AttachFront': { if(
我正在尝试将代码从 Java Utility Logging 更改为 Log4J2。要更改代码,我想在 Eclipse 中使用代码重构。例如更改:导入 java.util.logging.Logger
我有一个处理 Excel 文件中的行的函数。在这个函数中,我有一个 for 循环。现在,一旦提取一行,我们就会检查各种条件。如果任何条件为假,我们继续下一步row.可以使用模式使这段代码更加结构化吗?
我正在重构一个有很多嵌套调用的程序,例如 ServiceManagement.getGlobalizationService() .createExportCo
我在 JTabbedPane 上重构了许多字段以减少冗余。但是,当我为字段数量设置常量大小时,出现空指针异常。我不太确定为什么会发生这种情况。我做错了什么,更重要的是有人可以解释发生了什么事吗? pu
我试图通过删除 map.setOnPolygonClickListener 和 map.setOnMarkerClickListener 中的重复项来重构以下方法。 两个监听器执行完全相同的操作,我想
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
当我在这张照片中重构 Storyboard时 link . 我找不到在哪里可以交换标签栏项目的位置。 例如,我想将主菜单更改为索引 0。 这是我的storyboard . 最佳答案 您可以通过拖放标签
我是一名优秀的程序员,十分优秀!