javascript属性查找按[[prototype]]链严格向上逐级搜索,从对象自身开始,若未找到则沿__proto__依次访问原型对象,最终止于object.prototype的null,全程单向线性、不跳过不回退。

属性的层层查找机制,就是 JavaScript 在访问对象属性时,按固定顺序一级一级往上找的过程。它不跳过、不猜测、不回退,只沿着 [[Prototype]] 链严格向上搜索,直到找到或抵达终点 null。
查找从对象自身开始
每次访问如 obj.name 或 obj.sayHi(),引擎第一件事是检查 obj 自身是否拥有该属性(包括数据属性和方法)。如果有,直接返回,不继续查找。
- 这个“自身”指的是对象自己的属性槽,不是原型上的
- 哪怕原型上也有同名属性,只要自身存在,就优先用自身的
- 例如:
const obj = { name: "Alice" }; obj.__proto__.name = "Bob"; console.log(obj.name); // 输出 "Alice"
没找到就顺着 __proto__ 向上跳一级
如果自身没有,引擎立刻查看 obj.__proto](即 Object.getPrototypeOf(obj))所指向的对象,并在其中查找。这个过程是单向、线性的:
obj → obj.__proto__ → obj.__proto__.__proto__ → ...- 每跳一次,就换一个对象作为当前查找目标
- 不会横向比较多个原型,也不会跳到无关构造函数的 prototype 上
终点是 Object.prototype,终止于 null
所有普通对象的原型链最终都会经过 Object.prototype,而它的 __proto__ 是 null —— 这是整个链条的硬性终点:
-
Object.prototype提供了toString、hasOwnProperty、valueOf等通用方法 - 一旦查到
Object.prototype还没找到,引擎会再查一次它的__proto__(即null),然后停止 - 结果统一返回
undefined,不会报错
不同对象类型起点不同,但终点一致
虽然创建方式不同,原型链起始点有差异,但最终都汇入同一主干:
- 字面量对象
{}:直接以Object.prototype为原型 - 数组
[]:原型是Array.prototype,而Array.prototype.__proto__ === Object.prototype - 函数
function() {}:原型是Function.prototype,其__proto__也是Object.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











