object.create()是专为原型式继承设计的原生方法,接收一个对象作为新对象的原型并返回继承其属性的实例,支持属性描述符初始化自身属性,但仅浅克隆、共享引用类型。
可以直接用 object.create(),它是专为原型式继承设计的原生方法,不依赖构造函数,几行代码就能完成对象克隆和属性扩展。
用 Object.create 克隆基础对象
它接收一个对象作为新对象的原型,返回一个“空”实例,该实例通过原型链自动继承源对象的所有可枚举和不可枚举属性(不含私有字段)。
- 源对象本身成为新对象的
__proto__,即原型链第一环 - 新对象自身不包含源对象的属性,访问时沿原型链向上查找
- 适合复用配置、模板、共享行为,避免重复定义
示例:
const config = { timeout: 5000, retries: 3, log: true };
const devConfig = Object.create(config);
devConfig.timeout = 10000; // 只改自己,不影响 config
console.log(devConfig.retries); // 3 ← 从原型继承
带初始化属性的克隆
Object.create 支持第二个参数,用于定义新对象自身的属性(如 name、id),同时保持原型继承关系。
- 第二个参数是属性描述符对象,类似
Object.defineProperty的第三个参数 - 可精确控制
value、writable、enumerable、configurable - 避免污染原型,又保留继承能力
示例:
const baseUser = { role: 'guest', permissions: ['read'] };
const admin = Object.create(baseUser, {
name: { value: 'admin', writable: true },
role: { value: 'admin' } // 覆盖原型上的 role
});
console.log(admin.name); // 'admin'
console.log(admin.permissions); // ['read'] ← 来自原型
注意浅克隆与引用共享
Object.create 不做深拷贝,只建立原型链接。如果原型中有引用类型(如数组、对象),所有继承者共享同一份数据。
- 修改
admin.permissions.push('write')会影响baseUser.permissions - 如需隔离,应在创建后手动初始化副本:
permissions: { value: [...baseUser.permissions] } - 真正需要深克隆时,应换用
structuredClone()(现代环境)或 JSON 序列化等方案
替代方案对比
当仅需简单克隆且无引用风险时,Object.create 最轻量;若需完全独立副本,优先考虑:
-
structuredClone(obj):支持 Date、Map、Set、RegExp、嵌套循环引用,ES2022+ 原生支持 -
{...obj}或Object.assign({}, obj):仅浅克隆自有可枚举属性,丢失原型链和不可枚举属性 - 避免用
JSON.parse(JSON.stringify(obj)):会丢弃函数、undefined、Symbol、Date 对象等











