这个问题有一些评论,对重建对象的概念缺乏认识。评论者要么不能也不会解释为什么他们认为这是一个坏主意,但是因为要求我得出相同的结论。这就是原因。
如果考虑MVVM,拥有模型和视图模型的目的是将行为与数据分开。这很有趣,因为面向对象的要点是将它们结合起来。但在分布式世界中,数据必须随身携带。如果您的代码和数据全部集中在一起,那么您必须发明MVVM或保持去除和重构对象。
取消和重新构造对象的代码是您不需要的测试和维护时间接收器,并引入了两种故障模式。不要这样做。有一个无方法的类来保存状态,一个无状态的类在无方法的类上运行。这是MVVM的本质,实际上只不过是 Memento 模式的应用。
纪念品(283) 在不违反封装的情况下,捕获并外化对象的内部状态,以便稍后可以将对象恢复到此状态。
设计模式,Gamma 等,1995
我的视图模型的数据作为JSON在客户端JS和服务器Web API之间来回传递。
众所周知,JSON.stringify(object)
仅序列具有非{0}的非空值的成员。因此,Function
将从对象中删除所有方法。
我当前的实现将每个图节点实现为具有Serialise和Deserialise方法的Typescript类。 JQuery.ajax调用Web API并隐式地将结果JSON解析为对象定义的DAG,每个对象定义都有一个Type属性,指示序列化之前它是哪种类。我有一个按名称索引的构造函数的映射,并检索相应的构造函数,并将数据作为构造函数参数传递。
根据类型可能会有孩子;如果是这样的话,那么事情会递归地向下移动。
我一直在想是否,不是复制所有属性值,我不能只分配一个合适的原型。你可能会说,把山带到Mahomed。这将消除我的代码库中的一些混乱。
在我写这篇文章时,我发现我可以使用$ .extend,但我正在逐步清除代码库中的jQuery out ,所以这将是一个逆行的步骤。
在评论中已经观察到,分配原型意味着永远不会调用构造函数。这是无关紧要的。已经设置了对象状态,只需要使方法可用。
答案 0 :(得分:1)
我最近用方法构建了对象,可以将内容序列化然后重构。
我只是添加了一个可以接受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());

如果您现在通过数组拥有子项,则只需在链中递归重复该过程。
(奖励是您也可以通过这种方式传递选项。)