javascript - 从字符串重新实例化自定义类

标签 javascript class ecmascript-6

从持久数据结构重新实例化类的最佳方法是什么?

当前在存储时,我JSON.stringify()然后在重新实例化时解析该字符串,如下所示

 module.exports = class Player {
  constructor(str, isExistingInstance=false, rsn) {
    if(isExistingInstance) {
      try {
        parsedObject = JSON.parse(str)
        this.rsn = parsedObject.rsn 
        this.skills = parsedObject.skills
        this.kc = parsedObject.kc
      } catch (err) {
        console.log("Error instantiating object from exisiting instance. Expected JSON.stringify'd version of Player, Received: ", str)
      }
  } else {
    if(!rsn) throw new Error("Expected type of string for rsn, received: ", typeof(rsn));
  }
}

我不喜欢这种方法,因为即使它不是现有实例,您也必须提供 str 。有人对如何改进有任何建议吗?

我目前的想法是与此类似的“构建器”功能:

function buildNewPlayer(rsn) {
  new Player(null, false, rsn);
}

function buildExistingPlayer(str, rsn) {
  new Player(str, true, ""); 
}

这个方法看起来很困惑或肮脏,我觉得必须有一个更干净的方法来处理重新实例化。

最佳答案

构造函数应该用于创建实例,将解析和构建移至方法并在实例化类后调用它:

class Player {
  constructor() {
    this.rsn = null;
    this.skills = null;
    this.kc = null;
  }

  build(str, rsn) {
    if (rsn) {
      try {
        const parsedObject = JSON.parse(str);
        this.rsn = parsedObject.rsn;
        this.skills = parsedObject.skills;
        this.kc = parsedObject.kc;
      } catch (err) {
        console.log(
          "Error instantiating object from exisiting instance. Expected JSON.stringify'd version of Player, Received: ",
          str
        );
      }
    } else {
      throw new Error("Expected type of string for rsn, received: ", typeof rsn);
    }
  }
}

const str = '{"rsn": 123, "skills" : "a lot", "kc": "kc"}';

const playerOne = new Player();
playerOne.build(str, 123);

console.log(playerOne.skills);

关于javascript - 从字符串重新实例化自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58100573/

相关文章:

c++ - 函数如何读取指针?

objective-c - 如何在不同的类中调用选择器

javascript - 在某些情况下用另一个字符串替换一个字符串

javascript - 如果用户在模态框外单击,我如何防止模态框(使用 Bulma CSS 框架)关闭?

c - Objective-C运行时如何实例化根元类和其他类描述?

javascript - Babel es2015 预设不会将 Map 和 Set 转换为 es5

javascript - 陷入理解 Node js 的异步行为

javascript - 转译的 webpack 包不会通过 require 导出带连字符的包名称

javascript - 如何从 Node 脚本放入 REPL

javascript - Plotly 3dscatter 和色阶