JavaScript原型链查找属性是自动的线性搜索过程:先查对象自身(屏蔽原型同名属性),再沿[[Prototype]]链逐级向上查找,终点为Object.prototype(其[[Prototype]]为null),未找到返回undefined。

JavaScript 中原型链查找属性的过程,本质是一次从对象自身出发、逐级向上回溯的线性搜索,直到找到目标属性或确认不存在。这个过程完全自动,不需要手动触发,也不依赖语法糖,是语言底层运行机制的一部分。
第一步:检查对象自身是否拥有该属性
引擎首先在对象自身的属性中查找,包括所有自有属性(无论可枚举与否)。只要存在,就立即返回值,不再继续查找——这叫“属性屏蔽”,即自身属性永远优先于原型上的同名属性。
-
例如:
const obj = { x: 1 }; obj.__proto__.x = 2;,此时访问obj.x得到的是1,不是2 - 可用
obj.hasOwnProperty('x')判断是否为自有属性
第二步:沿着 [[Prototype]] 链向上逐级查找
若自身未命中,引擎会访问对象的内部属性 [[Prototype]](通常可通过 __proto__ 或 Object.getPrototypeOf(obj) 访问),然后在该原型对象上重复第一步的检查。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 每一步都只查当前对象自身,不跳过、不跨级
- 查找路径是确定的:比如数组实例 →
Array.prototype→Object.prototype→null - 函数对象的链是:函数实例 →
Function.prototype→Object.prototype→null
第三步:终点是 Object.prototype,终止于 null
Object.prototype 是绝大多数普通对象原型链的顶端,它提供了 toString、valueOf、hasOwnProperty 等通用方法。它的 [[Prototype]] 值为 null,标志着查找结束。
立即学习“Java免费学习笔记(深入)”;
- 如果一路查到
Object.prototype还没找到,且其上也没有该属性,最终返回undefined - 用
Object.create(null)创建的对象没有继承Object.prototype,它的原型就是null,查找一步就停
关键细节与注意事项
这个机制不关心属性是否可枚举、是否被 Object.defineProperty 设置为不可配置,只要存在(包括不可枚举属性),就会被查到;但也不会自动触发 getter/setter 的副作用,除非你明确读写该属性。
- 构造函数的
prototype属性,只影响用new创建的实例的[[Prototype]]指向 - 推荐用
Object.create(parent)或class语法构建委托关系,避免直接操作__proto__ - 动态修改原型(如
Object.setPrototypeOf())会影响性能,应尽量避免在热路径使用

















