object.create不是浅拷贝,而是原型继承机制;它创建的新对象自身为空,所有属性通过[[prototype]]链动态查找原对象,不复制属性值,与浅拷贝在语义、机制和用途上本质不同。

Object.create 不是浅拷贝方法,它创建的是一个以指定对象为原型的新对象,和浅拷贝在语义、机制与用途上完全不同。混淆常源于两者都“看起来像复制了对象”,但实际行为截然相反:浅拷贝是复制属性值(第一层),而 Object.create 是建立原型链继承关系。
Object.create 的本质是原型继承,不是拷贝
调用 Object.create(obj) 后,返回的新对象自身为空,所有属性都通过 [[Prototype]] 链向上查找——它不拥有任何自有属性,也不复制原对象的属性值。
- 修改原对象的可枚举属性(如
obj.a = 10),新对象读取newObj.a会得到更新后的值,因为它是动态查找原型上的属性 - 给新对象赋值同名属性(如
newObj.a = 20),会在新对象上创建自有属性,屏蔽原型上的同名属性,原对象不受影响 -
newObj === obj为 false,newObj instanceof obj.constructor也通常为 false(除非手动设置 constructor)
浅拷贝的目标是生成独立副本
浅拷贝(如 Object.assign({}, obj)、扩展运算符 {...obj}、Array.from(arr))真正目的是创建一个新对象/数组,把源对象第一层的属性值(基本类型)或引用(对象/数组)复制过去,让新旧对象在顶层结构上互不干扰。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 修改新对象的自有属性(如
copy.name = 'Alice')不影响原对象 - 但如果属性值是对象(如
copy.info.age = 30),原对象的info.age也会变——这是浅拷贝的局限,而非错误 - 所有属性都是“自有”的,不依赖原型链查找
典型使用场景对比
用 Object.create 的时候:
- 构建基于原型的对象模型,比如实现类式继承:
function Animal() {}; Animal.prototype.speak = function() {}; const dog = Object.create(Animal.prototype) - 创建空对象但保留特定原型行为(如模拟不可变基础对象)
- 需要“只读视图”或代理式访问,且希望底层数据变更能自动反映到视图上(谨慎使用,易引发隐式耦合)
用浅拷贝的时候:
- 函数参数解构保护:防止意外修改传入的对象
const config = { ...options } - 状态更新前备份顶层字段:
const next = { ...state, loading: true } - 合并配置:
Object.assign({}, defaults, overrides) - 数组操作前避免污染原数组:
const newArr = [...arr].sort()
常见误区:为什么 Object.create({a:1}) 不等于浅拷贝
假设 obj = { a: 1 }:
-
const copy = Object.assign({}, obj)→copy自有属性a:1,修改copy.a不影响obj.a -
const protoObj = Object.create(obj)→protoObj没有自有属性,protoObj.a查找自obj;改obj.a,protoObj.a立刻变 - 二者
Object.keys()结果不同:['a']vs[] - 二者
hasOwnProperty('a')结果不同:truevsfalse
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










