JS如何不改变对象结构解析JSON并赋值到自定义类实例
问题原因
你原来的写法错误地将JSON.parse()返回的普通JS对象直接赋值给了client1变量,覆盖了之前创建的Client类实例,自然丢失了类定义的额外属性和getter/setter。另外你提供的Client类本身存在语法错误:实例属性访问需要加this,且你定义的属性名是name_/age_/something_,但getter/setter里访问的是_name/_age,属性名不匹配,会触发未定义变量报错。
修复步骤
1. 先修正Client类的语法错误
class Client { name_ = null; age_ = null; something_ = null; get Name() { return this.name_; } set Name(val) { this.name_ = val; } get Age() { return this.age_; } set Age(val) { this.age_ = val; } get Something() { return this.something_; } set Something(val) { this.something_ = val; } }
2. 正确合并JSON数据到类实例
不要覆盖实例,而是使用Object.assign将JSON解析出的属性批量赋值到已创建的Client实例上,会自动触发对应的setter:
let client1 = new Client(); let js = ` { "Name": "Estes Benjamin", "Age": 31 } `; // 把解析出的对象属性合并到client1实例,而不是覆盖变量 Object.assign(client1, JSON.parse(js)); console.log(client1);
此时输出就会符合你的预期,包含something_: null的属性,同时保留类的所有getter/setter结构。
可选:更规范的封装方案
可以给Client类加静态方法专门处理JSON反序列化,复用性更强:
class Client { // ... 上面的属性和getter/setter不变 static fromJSON(jsonStr) { const instance = new Client(); Object.assign(instance, JSON.parse(jsonStr)); return instance; } } // 使用时直接调用即可 const client1 = Client.fromJSON(js);
内容的提问来源于stack exchange,提问作者lzaek
相关产品推荐
相关产品推荐

