JavaScript私有字段无法被JSON.stringify序列化该如何处理
私有字段JSON序列化问题解答
当前ECMAScript标准没有内置的通用方案可以让JSON.stringify自动序列化类的私有字段,默认必须手动处理。
底层原因
- 私有字段的设计核心是强封装性,默认仅类内部可访问,不属于对象的可枚举公有属性范畴
JSON.stringify的序列化规则是仅遍历对象自身的可枚举公有属性,天然会跳过所有私有成员
简化处理方案
无需为每个类单独编写全量toJSON逻辑,可以封装通用的序列化基类,子类仅需声明需要序列化的私有字段即可:
// 通用序列化基类 class Serializable { // 子类通过静态属性声明需要序列化的私有字段名(去掉#前缀) static serializedFields = []; toJSON() { return this.constructor.serializedFields.reduce((result, fieldName) => { result[fieldName] = this[`#${fieldName}`]; return result; }, {}); } } // 业务类继承基类即可 class Rectangle extends Serializable { #width; #height; // 声明要序列化的私有字段 static serializedFields = ['width', 'height']; constructor() { super(); this.#width = 3; this.#height = 5; } } let rect = new Rectangle(); console.log(JSON.stringify(rect)); // 输出 {"width":3,"height":5}
如果你的场景不支持类继承,也可以通过装饰器、混入函数等方式复用上述逻辑,减少重复代码。
内容的提问来源于stack exchange,提问作者Joshua Clark
相关产品推荐
相关产品推荐

