structuredclone 不调用 getter、不保留 setter,仅克隆属性当前值;未缓存的 getter 属性会变为 undefined,setter 完全被忽略,需手动重建或改用自定义克隆。

structuredClone 不会调用 getter,也不会保留 setter,它只克隆属性的当前值(即 getter 的返回值),而 setter 会被完全忽略。
getter 的值会被“快照”式复制
当对象某个属性通过 getter 返回一个动态计算的值(比如 get fullName() { return this.firstName + ' ' + this.lastName; }),structuredClone 不会执行该 getter 函数,而是尝试读取该属性——但前提是该属性是可枚举且有基础值(如已缓存、或 getter 已被触发过并写入自身)。更常见的情况是:如果该属性仅靠 getter 提供、且未在对象自身上设置实际值,structuredClone 会把它当作 undefined 处理。
- 若 getter 已被访问过,并将结果赋给了自身(例如
this._fullName = ...),那么克隆时可能拿到这个缓存值 - 若 getter 完全依赖外部状态(如全局变量、DOM 元素尺寸),structuredClone 无法捕获这种依赖,克隆后该属性在新对象中会丢失或为 undefined
setter 完全不参与克隆过程
setter 在 structuredClone 中没有任何作用。它既不会被调用,也不会被序列化进克隆结果。即使原对象中某属性有 setter(比如用于拦截赋值、触发更新),克隆后的新对象中该属性只是一个普通数据属性(或根本不存在),不再具备响应逻辑。
- 例如:
obj.count有 setter 每次赋值都触发console.log,克隆后的对象cloned.count = 5不会打印任何内容 - 如果希望克隆后仍保持 setter 行为,必须手动在克隆后重新定义(使用
Object.defineProperty)
替代方案:手动控制克隆逻辑
对含 getter/setter 的对象,若需保留行为语义,structuredClone 不适用,应改用自定义克隆方式:
- 用
Object.getOwnPropertyDescriptors获取所有属性描述符(含 get/set 函数),再用Object.defineProperties在新对象上重建 - 对 getter 属性,可选择“执行一次取值”或“保留 getter 函数本身”(注意函数不能跨上下文直接克隆,需确保作用域兼容)
- 若对象来自类实例,考虑在类中实现
toJSON或自定义clone()方法,显式处理计算属性与副作用逻辑
验证是否受影响的小技巧
快速判断一个对象是否会在 structuredClone 中丢失 getter/setter 行为:
- 运行
structuredClone(obj)后,检查关键属性是否存在、是否为预期类型 - 对比
Object.getOwnPropertyDescriptor(obj, 'prop')和克隆后对象的同名属性描述符,看get/set字段是否为空 - 对 getter 属性,尝试
Reflect.get(obj, 'prop')和Reflect.get(cloned, 'prop'),看结果是否一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











