Object.create本身不支持深拷贝,仅设置原型;配合深拷贝需先用Object.create创建继承原原型或null的干净对象,再递归深拷贝自有属性,以保留原型链、不可枚举属性等,避免{}污染。

Object.create 本身不支持深拷贝,它只创建一个新对象并将其原型设为指定对象,属性(尤其是引用类型)仍共享。想实现“用 Object.create 配合深拷贝”,本质是:先用 Object.create(null) 或 Object.create(prototype) 创建干净的空对象(避免污染或继承干扰),再把源对象的**自有可枚举属性值深拷贝过去**。
为什么要配合?Object.create 的作用是什么
直接 JSON.parse(JSON.stringify(obj)) 或结构赋值({...obj})会丢失原型、不可枚举属性、函数、undefined、Date、RegExp 等。而 Object.create 能保留原型链结构,为后续深拷贝提供正确的目标容器:
-
Object.create(Object.getPrototypeOf(source))→ 新对象继承 source 的原型(如 Array、自定义类实例) -
Object.create(null)→ 创建无原型的纯字典对象,适合做纯数据深拷贝目标 - 避免直接
{}导致意外继承Object.prototype方法(如hasOwnProperty被覆盖)
手动实现:Object.create + 递归深拷贝
以下是一个轻量、可读的递归深拷贝函数,兼容常见类型,并利用 Object.create 初始化目标:
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
// 处理 Date、RegExp 等内置类型
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
// 创建目标对象:继承原对象原型(保持 instanceof 和方法可用)
const cloned = Object.create(Object.getPrototypeOf(obj));
// 拷贝所有自有属性(含不可枚举,但需 Reflect.ownKeys)
for (const key of Reflect.ownKeys(obj)) {
cloned[key] = deepClone(obj[key]);
}
return cloned;
}
✅ 优势:保留原型、处理循环引用需额外加 Map 缓存;❌ 不处理 WeakMap/WeakSet/Function/BigInt(按需扩展)。
用 structuredClone(现代浏览器推荐)更简单
如果环境支持(Chrome 98+、Firefox 94+、Node.js 17.0+),直接用原生 structuredClone,它自动处理原型、Date、RegExp、Map、Set、ArrayBuffer 等,且内部已优化:
-
const copy = structuredClone(original)—— 最简方式,无需手写逻辑 - 若需控制原型,可先
Object.create出骨架,再用structuredClone拷贝属性到该骨架(但通常没必要,structuredClone 已包含原型信息) - 不支持的环境(如旧版 IE 或 Node.js
常见误区提醒
❌ Object.create(obj) 不是拷贝 —— 它让新对象以 obj 为原型,obj 还是原型上的属性,修改 obj 会影响新对象(如果没重写)。
❌ Object.assign(Object.create(proto), source) 只是浅拷贝 —— 嵌套对象依然引用原对象。
✅ 正确组合是:const target = Object.create(Object.getPrototypeOf(source)); → deepCopyProperties(source, target);


















