属性访问器无法实现真正深拷贝或延迟加载,但可结合Proxy与getter按需克隆嵌套子树,实现逻辑上的延迟克隆,适用于稀疏访问的深层对象。

属性访问器(Getters)本身不能直接实现深拷贝,更无法真正“延迟加载”克隆原始数据——因为克隆动作必须实际执行才能产生副本,而 getter 只是读取时的计算逻辑。但你可以利用 getter 的惰性求值特性,在深拷贝过程中**按需触发嵌套对象的克隆**,从而避免一次性递归遍历全部嵌套结构,达到“逻辑上的延迟克隆”效果。
核心思路:用 Proxy + getter 拦截访问,首次读取时才深拷贝对应子树
不预先克隆整个对象,而是返回一个代理对象。当用户首次访问某个属性(如 obj.nested.data)时,getter 才对 nested 这一层执行深拷贝,并缓存结果。后续访问直接返回已克隆的副本。
- 适用于嵌套层级深、但实际使用路径稀疏的场景(例如配置对象、AST 节点、大型表单数据)
- 需配合 WeakMap 缓存已克隆的引用,避免重复拷贝同一源对象
- 原始数据必须是可枚举、可序列化的普通对象/数组;函数、Symbol、Date、RegExp 等需单独处理
简易实现示例(仅支持 plain object/array)
以下是一个最小可行的封装:
function lazyDeepClone(target) {
const cache = new WeakMap();
function clone(val) {
if (val === null || typeof val !== 'object') return val;
if (Array.isArray(val)) return val.map(clone);
if (cache.has(val)) return cache.get(val);
const cloned = {};
cache.set(val, cloned);
// 不立即遍历所有 ownKeys,而是为每个 key 定义 getter
Reflect.ownKeys(val).forEach(key => {
Object.defineProperty(cloned, key, {
get() {
const originalVal = val[key];
return typeof originalVal === 'object' && originalVal !== null
? lazyDeepClone(originalVal) // 递归返回另一个代理
: clone(originalVal); // 基础类型或非对象直接克隆
},
configurable: true,
enumerable: true
});
});
return cloned;
}
return new Proxy({}, {
get(_, prop) {
if (prop in target) {
const val = target[prop];
return typeof val === 'object' && val !== null
? lazyDeepClone(val)
: clone(val);
}
return undefined;
},
has(_, prop) {
return prop in target;
},
ownKeys() {
return Reflect.ownKeys(target);
},
getOwnPropertyDescriptor() {
return { enumerable: true, configurable: true };
}
});
}
⚠️ 注意:这个 proxy 返回的对象不是真实克隆体,它没有自有属性,所有访问都走 getter。若需转成纯对象(如 JSON 序列化),仍需调用一次完整深拷贝。
与真实深拷贝的边界要分清
这种模式不是替代深拷贝,而是优化访问模式:
- ✅ 适合:只读场景、属性访问频率低、嵌套分支多但每次只用其中一两个
- ❌ 不适合:需要立刻获得完整独立副本(如传给不可信第三方库)、需保持原型链、涉及 setter 或 defineProperty 元操作
- ⚠️ 风险:若原始数据在 getter 触发前被修改,克隆结果将反映修改后的状态(即非快照式)
进阶建议:结合结构化克隆或 structuredClone(现代环境)
对于兼容性要求高或需真正隔离的场景,可混合使用:
- 顶层用 lazyDeepClone 包装,内部 getter 中调用
structuredClone(val)(如果可用)保证安全性 - 对 Date、Map、Set、TypedArray 等内置类型,提前在 getter 中识别并委托专用克隆逻辑
- 暴露一个
.toClonedObject()方法,供用户显式触发全量克隆


















