原型链是JavaScript运行时属性访问的必经通路,每次obj.prop或obj.method()求值都实时依赖其查找:先查自有属性,再沿[[Prototype]]链向上直至null;它独立于执行上下文但与函数调用深度耦合,被JIT深度优化却不可绕过。

原型链不是执行管线中某个“阶段”的产物,而是贯穿整个属性访问与方法调用过程的底层查找机制——它不参与语法解析、代码编译或执行上下文创建,但每一次 obj.prop 或 obj.method() 的求值,都实时依赖原型链完成属性定位。
它是运行时属性访问的必经通路
JavaScript 引擎在执行表达式时,只要涉及对象属性读取(包括方法调用),就会立即启动原型链查找:
- 先检查对象自身是否拥有该属性(自有属性)
- 若无,则通过内部 [[Prototype]] 链向上跳转到其原型对象
- 重复该过程,直到找到属性,或抵达
Object.prototype后再往上为null
这个查找发生在字节码执行阶段,属于解释器/即时编译器(如 V8 的 Ignition/TurboFan)在求值操作数时的同步行为,无需额外调度或等待。
它独立于执行上下文,但与函数调用深度耦合
执行上下文负责管理 this、作用域链、变量环境等,而原型链只管“这个属性在哪”——两者职责分离,但在关键节点交汇:
立即学习“Java免费学习笔记(深入)”;
- 当调用
obj.fn()时,引擎先沿原型链定位fn函数,再用obj作为this创建新执行上下文 -
new Constructor()过程中,引擎会把新对象的 [[Prototype]] 指向Constructor.prototype,这是原型链构建的显式介入点 - 箭头函数没有
prototype,也不参与原型链构建,但调用时仍需靠其所在对象的原型链找方法
它决定内置行为的可访问性边界
所有标准方法(toString、hasOwnProperty、map、push 等)都挂载在各级原型上:
-
Array.prototype.map→Function.prototype.call→Object.prototype.toString - 即使你删掉
arr.toString,只要没破坏arr.__proto__链,arr.toString()依然有效 - 引擎对
Symbol.iterator等内置符号的查找,同样走这条链,而非特殊路径
它被 JIT 优化深度感知,但不可绕过
V8 等引擎会对常见原型链结构做内联缓存(IC)和隐藏类追踪,大幅提升查找速度:
- 同一构造函数创建的对象,若原型链稳定,引擎会缓存“从 obj 到 map 方法的跳转路径”
- 一旦修改
prototype或动态增删属性,可能触发去优化(deoptimization) - 但无论是否优化,语义上每次访问都必须严格遵循原型链规则——没有捷径,也没有例外


















