object.create()不是浅拷贝方法,它创建新对象并将其原型设为参数对象,不复制自有属性;易被误解因原型链访问使属性读取看似“复制”,实为继承;需配合getownpropertydescriptors才能实现浅拷贝。

Object.create() 本身不是浅拷贝方法,它创建的是一个新对象,并将参数对象设为其原型(prototype),而不是复制属性值。所以直接用 Object.create(obj) 并不能实现常规意义上的“浅拷贝”,更不会把 obj 的自有属性(own properties)拷贝到新对象上。
为什么 Object.create() 容易被误认为是浅拷贝
因为它的行为看起来像“复制了结构”:新对象能读取原对象的属性,且修改原对象的可写属性时,新对象读取结果会变。但这只是原型链访问的结果,并非属性拷贝。例如:
const obj1 = { a: 1, b: { x: 2 } };
const obj2 = Object.create(obj1);
console.log(obj2.a); // 1 → 来自原型
obj1.a = 99;
console.log(obj2.a); // 99 → 原型变了,不是拷贝生效
此时 obj2 没有自有属性 a 或 b,所有读取都委托给 obj1。这不是拷贝,是继承。
如果非要配合使用,得先“提取自有属性”再挂载
想让 Object.create() 参与浅拷贝流程,必须手动把源对象的自有可枚举属性提取出来,作为新对象的初始属性。常见做法是组合 Object.getOwnPropertyDescriptors() 和 Object.create():
- 用 Object.getOwnPropertyDescriptors(obj) 获取 obj 所有自有属性的完整描述符(含 value、writable 等)
- 用 Object.create(null, descriptors) 创建一个无原型、且属性完全复刻的新对象
示例:
支持从 AWS、阿里云、GCP、华为云、Azure 向腾讯云迁移的 Landing Zone 全流程客户端。通过远程 MCP Server 自动完成:扫描源云资源(5朵云13种资源)、AI智能填充调研问卷、生成设计文档、生成Terraform代码。当用户提到云迁移、Landing Zone、Terraform、扫...
const source = { name: 'Alice', tags: ['js', 'web'] };
const shallowCopy = Object.create(null, Object.getOwnPropertyDescriptors(source));
shallowCopy.name = 'Bob'; // ✅ 修改自有属性,不影响 source
shallowCopy.tags.push('react'); // ❌ 仍共享引用,source.tags 也会变
这确实是浅拷贝:基本类型值被复制,引用类型值仍共享地址。
更实用的替代方案(推荐直接用)
日常开发中,不需要绕路用 Object.create() 实现浅拷贝。以下方法更直观、标准、可读性强:
- Object.assign({}, obj) —— 最常用,返回新对象,拷贝自有可枚举属性
- {...obj} —— 扩展运算符,语法简洁,效果同 assign
- Array.prototype.concat() / slice() —— 专用于数组浅拷贝
它们都明确以“拷贝属性值”为目标,语义清晰,浏览器兼容性好,也支持 Symbol 属性(assign 和扩展运算符均支持)。
总之,Object.create() 的核心角色是原型继承,不是数据拷贝。硬要配合浅拷贝,需额外封装属性提取逻辑;而实际项目里,直接用 assign 或展开运算符更稳妥、高效、不易出错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










