对象创建与继承的平衡关键在于按场景选择机制:构造阶段优化初始化成本,优先组合与接口降低耦合,高频路径避免多态开销,善用语言底层优化。

对象创建与继承的平衡,核心不在“选哪个”,而在“什么时候用什么机制”。灵活性高往往伴随运行时开销,性能优常以牺牲扩展性为代价。关键是在设计阶段识别热点路径与变化点,再分层应对。
构造阶段:控制实例属性初始化成本
父类构造函数若含重操作(如深克隆、同步 I/O、复杂计算),每次 new 都会执行——这是组合继承最易被忽略的性能瓶颈。现代写法虽用 Object.create(Parent.prototype) 避免原型上冗余执行,但 Parent.call(this, ...) 仍不可避免。
- 对高频创建对象(如游戏实体、日志事件),把耗时逻辑移到懒加载或工厂方法中,构造函数只做轻量赋值
- 引用类型字段(如
friends = [])若无需初始数据,可延迟初始化,避免无意义内存分配 - ES6 class 中可配合私有字段 + getter 实现按需计算,比构造时全量初始化更可控
继承结构:优先选组合与接口,慎用深层实现继承
实现继承(尤其是多级/多重)带来耦合与脆弱性:父类一改,子类行为可能意外偏移;菱形继承、虚函数表查找、vptr 内存开销都会累积。而接口继承或组合不绑定实现,更利于单元测试与热替换。
- 用抽象类或 interface 定义契约(如
Renderer.draw()),具体类只负责实现,不继承状态 - 需要复用逻辑时,优先委托(composition)而非继承:把通用能力抽成独立工具类或 mixin,由主类持有并调用
- 若必须继承,限制层级 ≤ 2 层,且基类保持稳定——避免在
BaseEntity里塞业务规则,只放生命周期钩子和基础字段
多态调用:区分关键路径与非关键路径
虚函数或 JavaScript 中的动态方法查找本身开销不大,但高频调用下会放大。真正影响性能的是间接跳转破坏 CPU 分支预测,以及无法内联导致的寄存器压力。
- 对每秒调用数万次的方法(如物理更新、渲染循环中的
update()),考虑模板化(C++)或单态调用(JS 中避免频繁切换对象形状) - 非关键路径(如配置加载、错误处理)可放心用多态,提升可维护性——这里省下的开发时间远大于几纳秒开销
- 在 C++ 中,确认虚函数是否真被 override;未使用的虚函数表项会浪费内存,且阻碍编译器优化
框架与语言特性:善用底层优化机制
现代引擎已对常见模式做了深度适配。硬套“最佳实践”反而可能绕过优化路径。
- ES6 class 底层是寄生组合继承,V8 对
super()有专用内联路径,比手写Parent.call(this)更快 - Java 中 final 类/方法可让 JIT 更激进地内联,但会损失扩展性;可在稳定模块加 final,在插件点保留 open 设计
- C++ 中用
using声明恢复重载可见性,比手动转发更高效,也避免隐藏引发的隐式转换开销











