原型方法优化关键在查得快、调用稳:需避免动态创建对象/函数、保持原型链稳定、优先用Object.create、减少属性访问深度。

原型方法的执行效率优化,关键不在“写得多”,而在“查得快”和“调用稳”。JavaScript 引擎(如 V8)对原型链上的方法访问做了深度优化,但前提是代码结构符合引擎的预期模式。不规范的写法会绕过内联缓存(IC)、破坏隐藏类(Shape),导致每次属性访问都退化为慢路径查找。
避免在原型方法中动态创建对象或函数
频繁在原型方法内部 new 对象、定义匿名函数或使用闭包,会阻止引擎对方法进行内联优化,并可能引发重复的隐藏类分裂。
- ❌ 不推荐:每次调用都新建数组和函数
Person.prototype.getFullName = function() {
return [this.firstName, this.lastName].join(' '); // 每次新建数组
const formatter = () => this.firstName.toUpperCase(); // 每次新建函数
return formatter() + ' ' + this.lastName;
};
- ✅ 推荐:复用常量、提前绑定或提取纯函数
const SPACE = ' ';
function upper(str) { return str?.toUpperCase() || ''; }
Person.prototype.getFullName = function() {
return upper(this.firstName) + SPACE + (this.lastName || '');
};
立即学习“Java免费学习笔记(深入)”;
保持原型链稳定,避免运行时修改 prototype
在构造函数实例化后,再向 prototype 添加/删除方法,会触发所有已存在实例的隐藏类失效,后续方法调用无法命中内联缓存。
- ❌ 动态扩展(尤其在热循环中)会重置优化状态
- ✅ 所有原型方法应在构造函数定义后、首次实例化前一次性设置完毕
- ⚠️ 特别注意:不要在模块加载后期、或用户交互回调里给内置原型(如 Array.prototype)打补丁
优先使用 Object.create 而非反复 new 构造函数
当目标是创建大量轻量级、配置相似的对象时,Object.create(prototype) 比 new Constructor() 更高效——它跳过了构造函数执行开销,直接建立 [[Prototype]] 链接,且更利于引擎识别“同构对象”模式。
- 适合场景:配置对象、事件处理器上下文、Canvas 像素处理器实例等
- 示例:用共享原型初始化百万级像素处理单元,比每个 new PixelProcessor 快 2–3 倍
减少跨原型层级的属性访问深度
引擎对浅层原型链(如 实例 → 构造函数.prototype → Object.prototype)访问做了高度优化;但若人为拉长链(如 A → B → C → D → Object.prototype),每次属性读取都要多走几步,内联缓存命中率下降。
- 避免多层继承:用组合代替深层原型链(例如用
delegate属性持有依赖对象,而非继承) - 对高频访问属性,可在实例初始化时“扁平化”到自身(如
this.toString = this.constructor.prototype.toString;),但需权衡内存占用


















