JavaScript原型链查找路径是从实例自身开始沿__proto__逐级向上查找属性或方法直至null的真实内存引用链;起点为实例.__proto__严格指向构造函数prototype,经prototype.__proto__指向Object.prototype,终点为Object.prototype.__proto__===null,遮蔽仅提前终止查找而不改变链结构。

JavaScript 中原型链的查找路径,就是属性或方法实际被访问时引擎真实走的那条路线:从实例对象自身开始,沿着 __proto__ 一级级向上跳转,直到找到目标,或抵达 null 停止。它不靠“类名”推断,也不依赖代码结构,而是由内存中真实的引用关系决定。
查找起点:实例自身的 __proto__
每次用 new 创建实例,引擎都会自动设置该实例的 __proto__,严格指向其构造函数的 prototype。比如:
-
const cat = new Cat()→cat.__proto__ === Cat.prototype恒成立 - 访问
cat.name时,第一步永远是检查cat自身有没有这个属性 - 有就直接返回;没有,才跳到
cat.__proto__所指的对象继续找
查找中继:prototype 和 __proto__ 的角色分工
prototype 是函数才有的属性,__proto__ 是对象才有的内部链接,二者职责不同但紧密关联:
-
Cat.prototype是一个普通对象,它自己也有__proto__ - 因为它是被
Object构造出来的,所以Cat.prototype.__proto__ === Object.prototype - 而
Object.prototype.__proto__是null,这是整条链的终点 - 因此完整路径是:
cat → Cat.prototype → Object.prototype → null
查找延长:多层继承时的路径变化
当存在多层继承(如 Dog.prototype = new Cat()),原型链会变长,但查找逻辑不变:
立即学习“Java免费学习笔记(深入)”;
-
dog.__proto__指向的是一个Cat实例(不是Cat.prototype) - 那个
Cat实例的__proto__才指向Cat.prototype - 再往上仍是
Cat.prototype.__proto__ === Object.prototype - 最终路径为:
dog → Cat实例 → Cat.prototype → Object.prototype → null
查找终止:遮蔽如何影响路径行为
遮蔽(shadowing)不会改变原型链结构,只让查找提前结束:
-
Cat.prototype.sound = 'meow',但cat.sound = 'roar'→ 访问cat.sound直接返回'roar',不继续向上找 -
delete cat.sound后,再次访问才会重新走完整路径 - 遮蔽是运行时发生的,仅作用于当前对象层级,不影响其他实例或原型本身
不复杂但容易忽略:这条路径是引擎在执行时真实发生的内存跳转,不是静态分析得出的逻辑关系。


















