JavaScript方法查找是运行时逐层向上遍历原型链的过程:先查实例自身属性,未找到则沿__proto__指向的内存地址跳转至原型对象(如Person.prototype→Object.prototype→null),任一级命中即执行并绑定this,全链无匹配则返回undefined。

实例对象调用方法时,JavaScript 引擎并不直接在对象自身找,而是启动一套明确的、逐层向上的查找流程——这个过程完全基于内存中的真实引用关系,不是抽象规则,而是可验证的运行时行为。
第一步:从实例自身开始搜索
引擎先检查该实例对象自身的属性空间(即自有属性),看是否存在目标方法名。比如 person1.sayHello,会先查 person1 对象内部有没有 sayHello 这个键。
- 如果存在,立即执行,不继续向上找;
- 如果不存在,就顺着它的
[[Prototype]](浏览器中可通过__proto__访问)跳转到上一级原型对象。
第二步:沿 __proto__ 一级级向上追溯
每次跳转,都是读取当前对象的 __proto__ 属性值,这个值是一个真实内存地址,指向另一个对象:
-
person1.__proto__→ 指向Person.prototype; -
Person.prototype.__proto__→ 指向Object.prototype; -
Object.prototype.__proto__→ 是null,链终止。
每跳一次,引擎就在那个新对象上重复第一步:查有没有该方法名。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
第三步:找到即执行,找不到则返回 undefined
只要在某一级原型对象上命中了方法(比如在 Person.prototype 上找到 sayHello),引擎就绑定 this 为原始调用者(person1),然后执行。
- 若整条链都未匹配,最终到达
null后仍无结果,表达式求值为undefined; - 此时若再尝试调用(如
person1.unknown()),就会报TypeError: undefined is not a function。
关键细节:所有查找都发生在运行时,且只读不修改
这个流程不改变任何对象结构,也不缓存路径。每次访问属性或方法,都重新走一遍链路(现代引擎会有隐藏类和内联缓存优化,但语义上仍等价于上述流程)。
-
__proto__是每个对象(除null)都有的内部链接,它决定“往哪找”; -
prototype只属于函数,是被__proto__指向的那个共享模板; -
Object.prototype是绝大多数链的终点,提供了toString、hasOwnProperty等基础能力。

















