减少原型链深度能直接提升属性读取速度,关键在于避免多层__proto__向上搜索;应将高频属性挂载实例、用object.assign或展开语法预填充、优先组合代替继承、纯字典对象用object.create(null)切断原型链。

减少原型链深度能直接缩短属性查找路径,从而提升深层嵌套对象的读取速度。关键不在于“嵌套层级”本身,而在于每次访问时是否要穿越多层 __proto__ 向上搜索——如果目标属性离实例越远,引擎开销越大。
把高频属性提前挂到实例上
避免让常用属性长期留在深层原型中。构造函数里直接赋值,相当于“打平”一次查找:
-
不要:只在父类原型上定义
getDisplayName(),子类反复调用 -
推荐:在子类构造函数中缓存引用
this.displayName = this.getDisplayName(); - 对只读配置类尤其有效,比如
config.apiTimeout在初始化时就解构赋值到实例字段
用 Object.assign 或展开语法预填充
合并原型上的默认值和实例数据,让属性落在当前对象自身,跳过原型遍历:
Object.assign(this, BaseDefaults, options);- 或使用对象展开:
{ ...BaseDefaults, ...options }创建新对象 - 适合配置对象、DTO、表单数据等结构相对固定的场景
慎用深层继承,优先组合代替继承
每多一层 extends 或 Object.create(parentProto),就增加一次原型链跳转。实际中常见问题:
- UI组件库中 “Button ← IconButton ← BaseButton ← Component ← EventEmitter” 链路过长
- 状态管理类 “Store ← ReduxStore ← ObservableStore ← BaseStore” 导致
getState()查找变慢 - 改用组合:把通用能力拆成独立对象(如
emitter、validator),通过属性持有而非原型继承
对纯字典型对象,考虑 Object.create(null)
如果对象仅作键值存储(比如缓存 Map、路由参数解析结果),不需要继承 Object.prototype 方法,可彻底切断原型链:
const data = Object.create(null); data.id = 123;- 此时
data.toString会是undefined,但data.id的读取不再触发任何原型查找 - 比普通对象快约 10%–20%,在高频循环(如渲染列表、日志聚合)中收益明显
不复杂但容易忽略:真正拖慢速度的往往不是嵌套本身,而是属性不在实例上、又不得不每次都向上翻好几层找。优化重点始终是——让引擎第一次访问就能命中。










