JavaScript对象属性查找遵循原型链机制:先在对象自身查找,未找到则沿__proto__逐级向上查找至Object.prototype,最终返回undefined;Object.prototype的__proto__为null,是查找终点。

JavaScript中对象属性的查找遵循原型链机制:当访问一个对象的属性时,引擎会先在对象自身查找;如果没找到,就沿着 __proto__(即内部的 [[Prototype]])向上一级原型对象查找,如此逐级向上,直到到达 Object.prototype;若仍没找到,则返回 undefined。
原型链的起点:对象自身的属性
每次读取属性(如 obj.name),JS 引擎首先检查该对象自身是否拥有该属性(通过 hasOwnProperty 可判断)。如果有,直接返回值,不继续查找。
- 例如:
const obj = { a: 1 }; obj.a→ 直接返回1 - 即使原型上有同名属性,也会优先取自身的(屏蔽效应)
向上查找:顺着 __proto__ 链逐级跳转
如果自身没有该属性,引擎会访问对象的 __proto__ 属性(对应其构造函数的 prototype),然后在该原型对象上查找;仍未找到,就继续查它的 __proto__,依此类推。
-
const arr = [];→arr.__proto__ === Array.prototype Array.prototype.__proto__ === Object.prototype-
Object.prototype.__proto__ === null(链的终点)
终点是 Object.prototype,再往上就是 null
Object.prototype 是绝大多数对象原型链的顶端(除少数如 Object.create(null) 创建的对象)。它提供了 toString、valueOf、hasOwnProperty 等通用方法。所有普通对象最终都继承自它。
立即学习“Java免费学习笔记(深入)”;
-
({}).toString()能用,是因为{}.toString在Object.prototype上 -
Object.prototype的__proto__是null,查找在此终止
可以用 Object.getPrototypeOf() 模拟查找过程
手动遍历原型链验证属性查找路径:
function getProperty(obj, key) {
let current = obj;
while (current !== null) {
if (current.hasOwnProperty(key)) return current[key];
current = Object.getPrototypeOf(current);
}
return undefined;
}
这个函数行为与 JS 引擎内部查找逻辑一致:从对象自身开始,逐级向上,直到 null。


















