Object.create不是浅拷贝,因为它只设置新对象的[[Prototype]]指向源对象,不复制其自身可枚举属性;浅拷贝需复制自有可枚举属性值,而Object.create创建的对象无自有属性,属性访问依赖原型链。

Object.create 本身不是为浅拷贝设计的,它只创建一个新对象,并将参数对象设为其内部 [[Prototype]](即 __proto__),**不会复制源对象自身的属性**。所以严格来说,Object.create(obj) 并不等于浅拷贝。
为什么 Object.create 不是浅拷贝
浅拷贝的核心要求是:创建一个新对象,把原对象**自身可枚举属性**(不含继承属性)的值逐个复制过去(对引用类型只复制引用地址)。而 Object.create(obj) 做的是:
- 新对象的
[[Prototype]]指向obj(即继承obj的属性) - 新对象自身 没有自有属性
- 访问属性时靠原型链查找,不是复制来的
例如:
let original = { a: 1, b: [2, 3] };let copy = Object.create(original);
console.log(copy.a); // 1(来自原型)
console.log(copy.hasOwnProperty('a')); // false(不是自有属性)
如何用 Object.create 配合其他操作实现浅拷贝效果
若你确实想借助 Object.create 构建一个“基于某原型 + 拥有自有属性副本”的对象,可以手动把源对象的自有可枚举属性赋值过去。这组合操作才接近浅拷贝逻辑:
立即学习“Java免费学习笔记(深入)”;
- 用
Object.create(proto)创建空对象,指定期望的原型 - 用
Object.assign(target, source)或for...in + hasOwnProperty把源对象的自有可枚举属性复制到新对象上 - 注意:
Object.assign只复制可枚举自有属性,符合浅拷贝语义
示例:
let proto = { x: 'shared' };let source = { a: 1, b: [2, 3] };
// 创建以 proto 为原型的新对象
let shallowCopy = Object.create(proto);
// 再把 source 的自有属性复制进去
Object.assign(shallowCopy, source);
console.log(shallowCopy.a); // 1(自有)
console.log(shallowCopy.x); // 'shared'(继承)
console.log(shallowCopy.hasOwnProperty('a')); // true
console.log(shallowCopy.hasOwnProperty('x')); // false
和真正浅拷贝方法的对比
标准浅拷贝(如 Object.assign({}, obj)、展开运算符 {...obj})默认原型是 Object.prototype。而上面组合方式能**自定义原型**,这是它独有的价值:
- 适合需要“带特定原型 + 属性副本”的场景(比如模拟类实例、封装受控对象)
- 不是替代
Object.assign,而是扩展能力:既控制原型,又拥有独立属性 - 仍属浅拷贝——对
source.b这样的引用值,复制的是数组引用,不是深克隆
注意事项
-
Object.create(null)创建无原型对象,后续无法用hasOwnProperty等继承方法,需改用Object.prototype.hasOwnProperty.call(obj, key) - 不可枚举属性(如通过
Object.defineProperty设置enumerable: false的)不会被Object.assign或for...in复制,需单独处理 - Symbol 属性也不会被
Object.assign复制(除非显式传入Object.getOwnPropertySymbols())


















