访问路径是从实例自身开始沿__proto__逐级向上查找属性直至null的物理引用链。起点为实例.__proto__指向构造函数prototype,继而跳转至Object.prototype,终点为null;多层继承时路径延长,遮蔽仅提前终止查找而不改变链结构。

访问路径就是属性查找时引擎实际走的那条路线:从对象自身开始,沿着 __proto__ 一级级往上跳,直到找到属性,或走到 null 停止。它不是靠“类名”或“constructor”推出来的,而是由内存中真实存在的引用链决定的。
路径起点:实例自身的 __proto__
每次用 new Cat() 创建实例,JS 就自动给它一个 __proto__,这个链接严格指向 Cat.prototype。也就是说:
-
cat.__proto__ === Cat.prototype—— 恒成立,不是约定,是引擎强制设置 - 查
cat.name时,第一步永远先看cat自己有没有这个属性 - 有就返回,没就立刻跳到
cat.__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(),这时 dog 的查找路径就变长了:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
dog.__proto__指向的是一个Cat实例(不是Cat.prototype) - 那个
Cat实例的__proto__才指向Cat.prototype - 再往上,
Cat.prototype.__proto__还是Object.prototype - 最终路径:
dog → Cat实例 → Cat.prototype → Object.prototype → null
路径干扰:遮蔽会让查找提前结束
如果在实例上直接赋值同名属性,就会“盖住”原型上的:
-
Cat.prototype.sound = 'meow',但cat.sound = 'roar' - 此时
cat.sound不会去原型找,直接返回'roar' - 删掉后:
delete cat.sound,再次访问才重新走完整路径 - 遮蔽不改变链结构,只改变查找是否终止在某一层
不复杂但容易忽略:路径是运行时真实发生的引用跳转,不是编译期推断的逻辑关系。

















