You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Serializable子类调用wake方法报错:解构参数未定义

问题描述

我研究这个问题好几天了,还是没搞清楚原因:我定义了一个Serializable类,包含两个核心方法——serialize()用于将实例序列化为字符串,wake(serialized)用于恢复实例。

class Serializable {
  constructor() {}

  serialize() {
    return JSON.stringify(this);
  }

  wake(serialized) {
    // 问题应该出在这里,我不知道怎么处理
    const unserialize = JSON.parse(serialized)
    return new this.constructor(unserialize)
  }
}

接着定义了继承自Serializable的User类:

class User extends Serializable {
  constructor({
    firstName,
    lastName,
  }) {
    super();

    this.firstName = firstName;
    this.lastName = lastName;
  }
}

创建User实例并序列化:

let newUser = new User({
  firstName: "Solid",
  lastName: "Snake",
})

const serialized = newUser.serialize()
newUser = null

尝试恢复实例时报错:

const wakeUp = new User.wake(serialized)

Quokka提示:Cannot destructure property 'firstName' of 'undefined' as it is undefined.,控制台报错:Uncaught TypeError: (destructured parameter) is undefined。

错误原因
  1. 调用方式错误:wake是实例方法,不能直接通过User.wake()调用,更不能用new关键字调用这个方法。这种调用方式会导致wake方法内部的this指向异常,最终new this.constructor(unserialize)实际调用的是Function构造函数,无法正确传递参数给User的构造函数。
  2. 方法语义不匹配:wake的作用是从序列化字符串恢复实例,这个逻辑不需要依赖已存在的实例,用实例方法实现不符合语义,也会增加调用复杂度。
修复方案

把wake改成静态方法,这样就能直接通过类调用,同时确保正确创建子类实例:

class Serializable {
  constructor() {}

  serialize() {
    return JSON.stringify(this);
  }

  static wake(serialized) {
    const unserialized = JSON.parse(serialized);
    // this指向调用该静态方法的子类(比如User)
    return new this(unserialized);
  }
}

恢复实例时,直接调用静态方法即可,不需要加new:

const wakeUp = User.wake(serialized);
console.log(wakeUp.firstName); // 输出 "Solid"

内容的提问来源于stack exchange,提问作者Iroquois Pliskin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:46:34