JSON.stringify()会自动调用对象自身的toJSON方法,用其返回值替代原对象参与序列化;该方法须为自有可枚举函数、无参、返回可序列化值,否则字段被忽略或报错。

当调用 JSON.stringify() 时,如果对象自身定义了 toJSON 方法,该方法会被自动调用,返回的值将作为序列化的输入,而不是原对象本身。
toJSON 方法必须是对象自身的函数属性
toJSON 不会从原型链上继承(除非显式设置在实例上或通过 Object.prototype,但不推荐后者)。只有对象自有属性中名为 toJSON 的函数才会被识别。
- ✅ 正确:直接挂载在对象上:
obj.toJSON = function() { return { id: this.id, name: this.name.toUpperCase() }; }; - ❌ 无效:仅在原型上定义(除非该对象没有自有
toJSON):MyClass.prototype.toJSON = ...,此时若实例没覆盖,仍会使用原型上的 —— 但需注意:JSON.stringify确实会查原型链,不过前提是对象没有自己的toJSON属性。更稳妥的做法是确保它存在于对象自身。
toJSON 必须返回可序列化的值
返回值会替代原对象参与后续序列化流程,因此应返回普通 JS 数据类型(如 plain object、array、string、number、boolean、null),不能返回函数、undefined、Symbol 或循环引用对象。
- ✅ 可行:
return { name: this._name, age: this._age }; - ❌ 报错:
return this;(可能引发循环引用)、return () => {};(函数被忽略为undefined,最终变成null) - ⚠️ 注意:
undefined、function、Symbol类型的返回值,在顶层会被转为null;若出现在嵌套对象中,则对应字段被忽略。
toJSON 在嵌套结构中也会被递归触发
只要某个属性的值是一个拥有 toJSON 方法的对象,它就会被单独处理。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
立即学习“Java免费学习笔记(深入)”;
- 例如:
const user = { name: 'Alice', profile: { toJSON() { return { summary: 'Active user' }; } } };JSON.stringify(user)输出:{"name":"Alice","profile":{"summary":"Active user"}} - 数组元素中含此类对象,同样生效:
JSON.stringify([user.profile])→[{"summary":"Active user"}]
与 replacer 参数的区别
toJSON 是对象级别的定制,优先级高于 replacer 函数。也就是说,JSON.stringify(obj, replacer) 会先调用 obj.toJSON() 得到新值,再把那个新值传给 replacer 处理。
- 若
toJSON返回一个简单对象,replacer就在这个简单对象上工作; - 若
toJSON返回null或基本类型,replacer接收到的就是那个值。
不复杂但容易忽略:确保 toJSON 是对象的自有方法,返回干净的可序列化结构,就能自然融入整个 JSON 序列化流程。

















