JavaScript属性访问遵循原型链查找机制:先查对象自身,再沿__proto__逐级向上委托查找,直至Object.prototype(其__proto__为null),未找到则返回undefined。

当 JavaScript 中访问一个对象的属性时,如果该对象自身没有这个属性,引擎会自动沿着 __proto__(即内部 [[Prototype]])指向的原型对象继续查找,直到找到该属性,或追溯到 Object.prototype 为止。如果连 Object.prototype 上也没有,就返回 undefined。
原型链的起点:每个对象都有 __proto__
几乎所有对象(除 null 和部分特殊对象外)的 __proto__ 都指向其构造函数的 prototype。例如:
-
let obj = {}→obj.__proto__ === Object.prototype -
let arr = []→arr.__proto__ === Array.prototype,而Array.prototype.__proto__ === Object.prototype -
let date = new Date()→date.__proto__ === Date.prototype,再往上是Date.prototype.__proto__ === Object.prototype
查找过程:一层层向上委托
属性查找不是“遍历”,而是“委托式”单向链式访问。引擎按如下顺序尝试获取属性值:
- 先检查对象自身是否有该属性(
hasOwnProperty为 true) - 没有则查
obj.__proto__上有没有 - 还没有,就查
obj.__proto__.__proto__(即上一级原型) - 持续向上,直到某一级原型为
null(Object.prototype.__proto__的值就是null)
一旦某级找到了属性,立即返回;若最终到 null 还没找到,就停止并返回 undefined。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
Object.prototype 是原型链终点
Object.prototype 是绝大多数对象原型链的顶端(除了用 Object.create(null) 创建的对象)。它自带如 toString、valueOf、hasOwnProperty 等方法,并且它的 __proto__ 是 null:
Object.prototype.__proto__ === null // true
这意味着查找在此终止。这也是为什么所有普通对象都能调用 .toString() —— 它来自 Object.prototype,而非对象自身。
手动验证原型链追溯
可以用循环 + __proto__ 打印整条链,观察如何最终抵达 Object.prototype:
let obj = { a: 1 };
let p = obj;
while (p !== null) {
console.log(p === Object.prototype ? '→ Object.prototype' : p);
p = Object.getPrototypeOf(p); // 推荐用 getPrototypeOf 替代 __proto__
}
输出会显示:obj → Object.prototype → null。如果对象是数组或日期等,中间还会出现 Array.prototype 或 Date.prototype,但最终都连到 Object.prototype。

















