代码之家  ›  专栏  ›  技术社区  ›  Peter Wone

从JSON重构JS对象

  •  1
  • Peter Wone  · 技术社区  · 9 年前

    为什么? 他们认为这是个坏主意,但自从问起,我就得出了同样的结论。原因如下。

    用于解构和重新构造对象的代码是您不需要的测试和维护时间接收器,并引入了两种故障模式。不要这样做。有一个无方法类来保存状态,还有一个无状态类在无方法类上操作。这就是MVVM的本质,实际上只不过是 纪念品

    纪念品(283) 在不违反封装的情况下,捕获并外部化对象的内部状态,以便稍后可以将对象恢复到此状态。

    ,γ 等


    原始问题

    视图模型的数据作为JSON在客户端JS和服务器Web API之间来回传递。

    JSON.stringify(object) Function . 因此 JSON.parse(JSON.stringify(someObject)) 将从对象中删除所有方法。

    我当前的实现将每个图节点实现为带有序列化和反序列化方法的Typescript类。JQuery。ajax调用Web API并将生成的JSON隐式解析为对象定义的DAG,每个对象定义都有一个类型属性,指示在序列化之前是哪种类型的类。我有一个按名称索引的构造函数映射,检索相应的构造函数,并将数据作为构造函数参数传递。

    根据类型,可能有儿童;如果是这样的话,事情就会沿着图递归进行。

    我一直在想,除了复制所有属性值,我是否可以只分配一个合适的原型。你可能会说,把这座山带给马霍米德。这将消除我的代码库中相当多的混乱。

    出来

    • 我的骗取原型的提议有任何已知的危险吗?
    • 有谁有更好的主意吗?美元除外。扩展,我的意思是。根据喜好,某种特定类型的东西。

    在注释中观察到,分配原型意味着永远不会调用构造函数。这无关紧要。对象状态已经设置好,只需使方法可用。

    1 回复  |  直到 8 年前
        1
  •  2
  •   user1693593 user1693593    9 年前

    我最近用一些方法构建了对象,这些方法可以序列化内容,然后重构内容。

    使用普通对象的示例:

    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());

    如果你现在通过数组有了孩子,你只需沿着链递归地重复这个过程。

    (另一个好处是,您也可以通过这种方式传递选项)。