Object.create()可快速实现基于原型的对象复制:基础克隆返回空对象,其__proto__指向源对象以继承属性;支持属性描述符定义自有属性;但引用类型共享,需手动深拷贝。

用 Object.create() 就能快速实现基于原型的对象复制,不需要构造函数,也不需要手动设置 __proto__。
基础克隆:继承属性但不拷贝到自身
调用 Object.create(prototypeObj) 会返回一个新对象,它的 __proto__ 直接指向传入的源对象。新对象自身为空,所有属性都通过原型链访问。
- 源对象的可枚举和不可枚举属性(除私有字段外)均可被继承
- 修改新对象的自有属性,不会影响源对象
- 适合复用配置模板、行为共享等场景
例如:
const base = { host: 'api.example.com', timeout: 3000 };const dev = Object.create(base);
dev.timeout = 10000;
console.log(dev.host); // 'api.example.com' ← 来自原型
带自有属性的克隆:覆盖或补充定义
Object.create 支持第二个参数——属性描述符对象,可用于在新对象上直接定义自有属性,同时保留原型继承关系。
- 用
value设置初始值,writable控制是否可修改 - 可精准覆盖原型上的同名属性(如
role: { value: 'admin' }) - 避免污染原型,又保持继承灵活性
例如:
const userProto = { level: 1, tags: ['user'] };const admin = Object.create(userProto, {
id: { value: 1001, writable: true },
level: { value: 99 } // 覆盖原型值
});
注意引用类型共享问题
Object.create 是浅链接,不是深拷贝。如果原型中包含数组、对象等引用类型,所有继承者共享同一份内存。
-
admin.tags.push('admin')会同步反映在userProto.tags上 - 若需隔离,应在创建后手动初始化副本:
tags: { value: [...userProto.tags] } - 真正需要完全独立副本时,改用
structuredClone()(ES2022+)或JSON.parse(JSON.stringify(obj))
和其他方式对比
它比 Object.assign({}, obj) 或展开运算符更轻量,因为保留了原型链;但比 structuredClone 更简单、兼容性更好(IE 不支持后者)。
- 仅需继承 + 少量自有属性 → 选
Object.create - 需要完全隔离的副本 → 优先用
structuredClone - 只复制自有可枚举属性、丢弃原型 → 可用
{...obj}或Object.assign

















