object.create() 可绕过构造函数实现原型继承,新对象以源对象为原型,属性动态访问且自身干净;支持属性描述符定制自有属性,但引用类型需手动深拷贝避免共享。

直接用 Object.create() 就能绕过构造函数,几行代码完成对象复用和个性化初始化,特别适合配置对象、角色模板、UI组件默认行为等场景。
用 Object.create() 快速继承基础结构
它不创建新类型,只让新对象以现有对象为原型,自动获得其所有属性(包括不可枚举的),自身保持干净。源对象的属性不会被复制到新对象上,而是通过原型链动态访问。
- 新对象的
__proto__直接指向源对象,形成最简原型链 - 修改新对象自有属性(如
timeout)不会影响源对象 - 读取未定义的属性(如
retries)会自动沿原型链查找
带自有属性的初始化更可控
第二个参数支持属性描述符,可精确声明哪些是新对象自己的属性,避免意外覆盖或污染原型。
- 用
{ value: ..., writable: true }定义可变字段(如name) - 用同名 key 覆盖原型上的值(如把
role: 'guest'改成role: 'admin') - 所有描述符(
enumerable、configurable)都可按需设置
注意引用类型共享问题
原型式继承是浅层链接,数组、对象等引用类型在所有实例间共享,一改全改。
- 比如
permissions: ['read']被多个实例继承,push('write')会影响所有人 - 若需独立副本,应在初始化时手动创建:
permissions: { value: [...baseUser.permissions] } - 真正需要深隔离时,换用
structuredClone()或序列化方案
比手写构造函数更轻量
不用定义空构造器、不用调用 call 绑定 this、不用手动设置 prototype,也没有 new 的隐式开销。
- 适用于一次性模板对象、环境配置差异(dev/staging/prod)、权限角色分层
- 配合解构赋值或扩展运算符,还能进一步组合:
{ ...Object.create(base), extra: true } - 语义清晰:不是“实例化”,而是“基于某对象衍生一个新行为体”











