组合寄生式继承中借用Object.create的核心目的是避免冗余对象创建以优化空间使用;它不执行父构造函数,仅创建[[Prototype]]指向父原型的干净对象,从而消除普通组合继承中因new SuperType()导致的实例属性内存浪费。
组合寄生式继承中借用 object.create 的核心目的,不是降低时间复杂度,而是避免原型链构建过程中的**冗余对象创建**,从而优化空间使用。
为什么普通组合继承会浪费内存
在传统组合继承里,子类原型通过 SubType.prototype = new SuperType() 设置。这行代码会真实执行一次父构造函数,生成一个完整实例——哪怕这个实例只用来当原型用。它携带了所有实例属性(比如 this.colors = ['red', 'blue']、this.name),这些属性对原型链本身毫无意义,却长期驻留在内存中,且被所有子类实例共享(引发引用类型污染风险)。
Object.create 如何减少对象开销
Object.create(Parent.prototype) 不调用构造函数,只做一件事:创建一个新对象,将其内部 [[Prototype]] 指向 Parent.prototype。这个新对象是“干净”的:
- 不包含父类实例属性(如
colors数组) - 不执行父类初始化逻辑(无副作用、无临时变量分配)
- 仅承担原型链中“连接点”角色,体积最小化
更进一步:手动模拟的轻量替代方案
某些高性能场景(如框架内部大量动态生成子类)会避开 Object.create,改用空函数中转:
function F() {}<br>F.prototype = Parent.prototype;<br>Child.prototype = new F();<br>Child.prototype.constructor = Child;
这种方式跳过 Object.create 内部可能存在的属性描述符处理、参数校验等逻辑,在旧引擎或高频调用下,能减少中间对象和闭包引用,使原型对象的内存布局更紧凑。
关键结论
这种优化的本质是“按需分配”:
- 实例属性 → 由
Parent.call(this)在子类构造器中按需创建(每个实例独有) - 原型方法与共享行为 → 由
Object.create或中转函数建立纯原型链接(零实例数据)
它把原本混在一起的“实例数据”和“类型结构”彻底分离,让内存占用严格对应语义需求,不为原型链多留一字节。










