关键在于统一构造逻辑、静态挂载方法、固化继承层级并杜绝原型篡改:构造函数首行声明全部属性,原型方法一次性写入,用class明确继承,禁用object.setprototypeof和__proto__。

实现可预测的原型链修改与访问流程,关键在于让 JavaScript 引擎(如 V8)能稳定地进行内联缓存(IC)和隐藏类(hidden class)优化。这不是靠“手动调优链路”,而是通过一致的代码结构、明确的初始化顺序和克制的运行时操作,让引擎可以准确推测对象形态与方法位置。
统一构造逻辑:所有实例属性在构造函数开头一次性声明
引擎为每个构造函数生成隐藏类,若不同实例添加属性的顺序、数量或类型不一致,会触发隐藏类分裂,导致后续方法查找失效。
- 始终在构造函数第一行就声明全部实例属性,哪怕初始值是 null、undefined 或默认字面量
- 避免在 if/else、switch 或异步回调中动态添加属性(例如
this.id = id只在某条件下执行) - 同一属性尽量保持类型稳定:比如
this.count = 0后不要赋值this.count = "zero",否则会退化为字典模式
方法挂载需静态、集中、不可变
原型方法必须在类/构造函数定义后立即挂载到 prototype 上,禁止运行时增删改。
- 所有方法应在模块加载阶段一次性写入
MyClass.prototype.xxx = function(){...} - 禁用
delete MyClass.prototype.method、MyClass.prototype.method = null等破坏性操作 - 如需条件行为,改用参数控制(如
new List({ sortable: true })),而非后期打补丁式修改原型
优先使用 class 语法并固化继承层级
class 提供更清晰的静态结构,V8 对 extends 链有专门优化,但前提是继承关系稳定、无动态替换。
- 用
class A {}和class B extends A {}明确表达继承,避免手工设置B.prototype = Object.create(A.prototype) - 子类构造函数中必须先调用
super(),且调用前不能访问this - 避免混用 class 与传统函数式继承(如
function C() {}继承自class B),易引发隐藏类不兼容
杜绝运行时原型篡改操作
Object.setPrototypeOf() 和 __proto__ 会强制中断 IC 缓存,并可能使对象退出快属性机制。
- 绝不在线上热路径(如渲染循环、高频事件处理)中调用
Object.setPrototypeOf(obj, proto) - 避免在构造函数或生命周期钩子中读写
obj.__proto__ - 如需委托或动态行为,优先考虑组合(composition)、代理(Proxy)或策略对象,而非修改原型引用











