object.create 不用于浅拷贝,而是创建以指定对象为原型的新对象;它不复制属性值,仅建立原型链关系;需配合 object.assign 或展开运算符等才能实现“带原型的浅拷贝”。

Object.create 本身不用于浅拷贝,它创建的是以指定对象为原型的新对象,新对象与原对象之间是原型链关系,不是属性值的复制。因此,不能直接用 Object.create 实现浅拷贝,但可以配合其他浅拷贝方法(如 Object.assign、展开运算符)来构造“基于某原型 + 浅拷贝属性”的对象。
Object.create 的作用不是拷贝,而是设置原型
例如:
const original = { a: 1, b: { c: 2 } };
const protoObj = Object.create(original);
console.log(protoObj.a); // 1 ← 从原型上读取
protoObj.a = 99;
console.log(protoObj.a); // 99 ← 自身属性覆盖原型
console.log(original.a); // 1 ← original 未被修改
这里 protoObj 并没有拷贝 original 的可枚举属性,只是把 original 当作其 [[Prototype]]。这不是浅拷贝,也不满足“独立副本”的需求。
想实现“带指定原型的浅拷贝”,需组合使用
常见做法:先用浅拷贝方法复制属性,再用 Object.create 设置原型(或反过来,但后者不生效)。推荐方式是:
- 用
Object.assign({}, source)或{...source}创建浅拷贝对象; - 再用
Object.setPrototypeOf(newObj, prototype)显式设置原型(因为Object.create无法复用已有对象并注入属性)。
示例:
const original = { x: 1, y: { z: 2 } };
const prototype = { shared: 'yes' };
// 步骤1:浅拷贝 original 的自身可枚举属性
const copy = { ...original };
// 步骤2:设置原型(等价于 Object.create(prototype) + assign)
Object.setPrototypeOf(copy, prototype);
console.log(copy.x); // 1 ← 自身属性
console.log(copy.shared); // 'yes' ← 来自原型
console.log(copy.y === original.y); // true ← 引用未变,符合浅拷贝
为什么不直接 Object.create(original) 然后赋值?
有人尝试:
const copy = Object.create(original); Object.assign(copy, original); // 把 original 自身属性复制到 copy 上
这确实能得到一个“有 original 作为原型 + 自身含相同属性”的对象,但它多了一层不必要的原型继承,且容易引发误解(比如误以为修改 copy.x 会影响 original.x,其实不会)。若目标只是浅拷贝,直接 {...original} 更清晰;若还需继承行为,才考虑组合方式。
注意:浅拷贝的限制依然存在
无论是否结合 Object.create,浅拷贝只复制第一层属性引用:
- 基本类型(string/number/boolean)值被真正复制;
- 对象、数组、函数等仍共享同一引用;
-
Object.create的介入不改变这一行为,它只影响属性查找路径。
所以嵌套对象修改仍会相互影响,深拷贝需另用 structuredClone、序列化或递归方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











