JavaScript方法查找沿__proto__链向上搜索,从对象自身开始,逐级检查原型直至null;遵循就近原则,同名属性出现即停止;方法查找不受可枚举性影响。

JavaScript 运行时查找方法,本质是沿着对象的 __proto__ 链向上搜索,直到找到匹配的方法名,或到达原型链末端(null)为止。
从当前对象开始查找
当调用 obj.method() 时,引擎先检查 obj 自身是否拥有名为 method 的可枚举属性(包括方法)。如果存在且是函数,直接执行,不继续查找。
逐级向上遍历原型链
若自身没有该方法,引擎会访问 obj.__proto__(即构造函数的 prototype),检查该原型对象上是否有 method。如果没有,继续访问 obj.__proto__.__proto__,依此类推。
- 每个普通对象的
__proto__指向其构造函数的prototype - 函数对象的
__proto__指向Function.prototype - 数组、日期等内置对象也遵循同样规则,最终都连到
Object.prototype -
Object.prototype.__proto__是null,链在此终止
遇到同名属性就停止搜索
原型链查找是“就近原则”:只要某一层原型上定义了该属性(即使不是函数),查找立即结束,不会继续往上找。比如在 Array.prototype 和 Object.prototype 都有 toString,但数组实例调用时取的是 Array.prototype.toString,因为更靠前。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
注意属性可枚举性与继承方式
只有通过 prototype 添加或使用 class/function 定义的方法才会被继承。用 Object.defineProperty 设置 enumerable: false 的属性仍可通过原型链访问,但 for...in 不会遍历它——而方法查找不受 enumerable 影响,只看是否存在。
不复杂但容易忽略

















