Object.create() 可快速创建继承指定原型的新对象,新对象自身无属性、通过原型链访问继承属性,修改基本类型属性不影响原对象,但引用类型仍共享需手动隔离。

直接用 Object.create() 就行,不用写构造函数、也不用定义类,几行代码就能基于一个现有对象生成新实例。
核心就是:新对象的 __proto__ 指向原对象,自动继承它的属性和方法,但自身修改不影响原对象(基本类型)
用 Object.create(proto) 快速克隆基础结构
它接收一个对象作为原型,返回一个“空”实例——这个实例自身没有属性,所有可访问的属性都来自原型链。适合复用配置模板、行为共享等轻量场景。
- 原对象变成新对象的
[[Prototype]](即__proto__) - 新对象读取属性时,自动向上查找
- 修改新对象自身的属性(如字符串、数字),不会波及原型
const baseConfig = { timeout: 3000, retries: 2, enabled: true };
const devConfig = Object.create(baseConfig);
devConfig.timeout = 10000; // 只改自己
console.log(devConfig.retries); // 2 ← 来自原型用 Object.create(proto, propertiesObject) 定义专属属性
第二个参数允许你直接给新对象添加自有属性,并控制 writable、enumerable 等行为,避免污染原型。
- 属性描述符写法清晰,语义明确
- 覆盖原型上的同名属性(如
role),只影响当前实例 - 不会改变原对象,也不会被其他继承者看到
const userTemplate = { role: 'guest', permissions: ['read'] };
const admin = Object.create(userTemplate, {
name: { value: 'admin', writable: true },
role: { value: 'admin' } // 覆盖原型值
});
console.log(admin.permissions); // ['read'] ← 继承而来注意引用类型仍共享,需手动隔离Object.create 只建立原型链接,不拷贝数据。如果原型里有数组、对象等引用类型,所有实例共用同一份内存。
-
admin.permissions.push('write')会改掉userTemplate.permissions - 解决办法:创建时用浅拷贝初始化,比如
permissions: { value: [...userTemplate.permissions] } - 或者克隆后单独处理:
admin.permissions = [...userTemplate.permissions];
什么时候该换别的方法?
- 如果需要完全独立副本(含嵌套对象)、不依赖原型链 → 用
structuredClone()(现代环境)或{...obj}+ 手动处理不可枚举属性 - 如果只是复制自有可枚举属性、不关心原型 →
Object.assign({}, obj)更直白 - 如果要兼容老环境且需深拷贝 →
JSON.parse(JSON.stringify(obj))(注意 Date、Function 等会丢失)
不复杂但容易忽略

















