手动模拟原型链查找需沿对象的__proto__(推荐object.getprototypeof())逐级向上搜索,先查自身属性,再查各层原型,直至找到属性或到达null。

手动模拟原型链查找,核心是沿着对象的 __proto__(或 Object.getPrototypeOf())逐级向上,直到找到目标属性或到达 null。它不依赖 JavaScript 引擎的内部机制,而是用代码显式复现“属性访问时的查找路径”。
理解原型链查找的基本逻辑
当访问 obj.prop 时,JavaScript 实际执行:
- 先检查
obj自身是否拥有该属性(hasOwnProperty或Object.prototype.hasOwnProperty.call(obj, 'prop')); - 如果没有,就去
obj.__proto__上找; - 再没有,就继续查
obj.__proto__.__proto__; - 如此反复,直到某一级有该属性,或原型为
null(即到达原型链顶端)。
手写一个基础版 getProp 函数
以下函数接收一个对象和属性名,返回查找到的属性值(或 undefined):
注意:不处理 getter、Symbol 属性、不可枚举属性等边界情况,仅聚焦主干逻辑。
function getProp(obj, key) {
let current = obj;
while (current !== null) {
if (current.hasOwnProperty(key)) {
return current[key];
}
current = Object.getPrototypeOf(current);
}
return undefined;
}
用法示例:
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
console.log(getProp(child, 'b')); // 2(自身有)
console.log(getProp(child, 'a')); // 1(从 parent 找到)
console.log(getProp(child, 'c')); // undefined(没找到)
增强版:支持返回属性描述符和查找路径
如果想进一步调试或理解查找过程,可返回更详细信息:
function findProp(obj, key) {
let current = obj;
let path = [];
while (current !== null) {
path.push(current);
if (current.hasOwnProperty(key)) {
return {
value: current[key],
descriptor: Object.getOwnPropertyDescriptor(current, key),
from: current
};
}
current = Object.getPrototypeOf(current);
}
return { found: false, path };
}
这个版本能告诉你属性在哪一层被找到、它的描述符是什么,甚至记录完整遍历路径,适合教学或调试原型行为。
关键细节与注意事项
-
__proto__是非标准但广泛支持的属性,推荐用Object.getPrototypeOf()替代; - 不能用
for...in模拟查找,因为它包含继承的可枚举属性,且顺序不确定; - 要区分“自有属性”和“继承属性”,
hasOwnProperty只检测前者; - 函数、数组等内置对象的原型链较长(如
[] → Array.prototype → Object.prototype → null),手动模拟时需注意终止条件; - 箭头函数没有
prototype,也不能作为构造函数,不影响原型链查找逻辑本身,但影响你能否用new构造它。











