原型链是JavaScript属性查找的默认机制,优化核心在于控制链长、稳定结构、合理分配属性:缩短原型链深度、缓存高频属性、保持原型纯净、优先使用字面量工厂。

原型链本身不是用来“优化”的工具,而是 JavaScript 属性查找的默认机制。所谓“通过原型链优化”,实质是减少查找开销、避免隐性性能陷阱——核心在于控制原型链长度、稳定对象结构、合理分配属性位置。
控制原型链深度,优先用组合代替继承
每多一层原型查找,引擎就要多一次内存解引用。10 层链下,访问原型属性比自有属性慢 3–5 倍,尤其在循环中反复读取时更明显。
- 把可复用逻辑封装成独立对象,通过实例字段持有(如 this.formatter = new DateFormatter()),而非让子类层层继承
- 避免用 Child.prototype = new Parent() 构建长链;改用 Object.setPrototypeOf(child, parentProto) 或 ES6 class 的单层继承
- 纯数据对象(如配置项、DTO)直接用字面量创建,不挂原型,彻底消除查找路径
把高频访问的属性/方法缓存到实例自身
原型上的属性每次都要沿链查找,而自有属性一步到位。对频繁读取的成员,初始化时复制或绑定一次即可显著提速。
- 属性缓存:this._id = this.id;(当
id来自原型且被循环读取) - 方法绑定:this._render = this.render.bind(this); 或 this._render = super.render;(避免每次调用都查原型)
- 注意:缓存只对读取密集场景有效;写入频繁或值常变时,需权衡一致性
保持原型对象纯净,避免运行时修改
原型一旦被修改(如增删属性、调用 Object.seal()),V8 的内联缓存(IC)容易失效,回退到慢路径,反而拖累整体性能。
- 所有共享方法和不可变默认值,统一定义在 prototype 上,创建后不再改动
- 不要在原型上放可变引用类型(如 this.items = []),防止实例间意外共享
- 需要实例独有状态,务必在构造函数中初始化(this.items = [];),而不是依赖原型提供
用字面量工厂替代构造函数,兼顾结构统一与隐藏类优化
现代 V8 对结构一致的对象字面量同样生成高效隐藏类。相比传统构造函数,工厂函数更易保证属性顺序、存在性和初始化时机。
- 推荐写法:const createUser = (name, email) => ({ name, email, id: null });
- 所有返回对象都有
name、email、id,顺序固定,无动态添加 - 比
new User(name, email)更轻量,且天然规避了构造函数中漏赋值或错序的风险

















