优化原型式继承实例化速度的关键是减少开销:用Object.create(null)切断原型链、预填充高频属性到实例自身、用Object.assign或展开语法合并默认值、避免长链式继承而改用组合。

优化原型式继承的实例化速度,核心是减少每次创建实例时的开销,避免重复构造、冗余查找和不必要的原型链跳转。关键不在于“继承形式”本身,而在于实例对象能否快速获得所需属性和方法,且不依赖深层遍历。
优先用 Object.create(null) 替代默认原型链
如果实例仅作数据容器(如配置项、路由参数、缓存键值对),不需要 toString()、hasOwnProperty() 等原生方法,直接切断原型链能显著提速:
- 普通对象:const obj = {} → 原型链为 obj → Object.prototype → null(2层查找)
- 无原型对象:const obj = Object.create(null) → 原型链为 obj → null(1层终止)
- 实测在万级循环中,属性读取快约 15%,且避免了隐式调用 Object.prototype 方法带来的额外判断
预填充高频属性到实例自身
不要让常用字段长期留在原型上等待运行时查找。在实例化时就“打平”一次:
- 错误写法:原型上定义 getLabel(),每次访问都触发函数调用 + 原型链查找
- 推荐做法:构造时计算并挂载 this.label = this.getLabel();或解构赋值 this.id = options.id || defaults.id
- 适用于配置类、DTO、表单初始数据等结构稳定、读多写少的场景
用 Object.assign 或展开语法合并默认值
替代层层 new 或 Object.create(parent) 的方式,把默认配置和用户选项一次性落到实例上:
- const instance = Object.assign(Object.create(null), BaseConfig, options)
- 或 const instance = { ...BaseConfig, ...options }(注意浅拷贝限制)
- 这样所有属性都在实例自身,完全跳过原型链,初始化后首次访问即命中
避免长链式原型继承
每多一层 Object.create(parent) 或 extends,就增加一次 [[Prototype]] 跳转。常见瓶颈如:
- UI组件链 Button ← IconButton ← BaseButton ← Component ← EventEmitter(5层)
- 状态类 Store ← ReduxStore ← ObservableStore ← BaseStore(4层)
- 改用组合:将 emitter、validator、serializer 等能力作为独立对象持有,例如 this.emitter = new Emitter(),而非继承其原型

















