深度搜索指沿原型链逐级向上遍历并判断,而非仅查直接原型;需处理null、原始值、Proxy、循环链等边界,用WeakSet防无限循环,并支持matcher函数抽象匹配逻辑。

要实现 Object.getPrototypeOf 的“深度搜索”,本质是沿着原型链向上遍历,直到找到第一个满足条件的对象(如包含某属性、符合某构造函数、或匹配某特征),而不是只查直接原型。关键不是“重写 getPrototypeOf”,而是封装一个健壮的遍历逻辑。
明确目标:什么是“深度搜索”
JavaScript 原生的 Object.getPrototypeOf(obj) 只返回对象的**直接原型**。所谓“深度搜索”,是指重复调用它,逐级向上检查整个原型链(包括 Object.prototype、null 终止点),并在过程中做判断或收集信息。
健壮性体现在:正确处理 null、undefined、原始值、Proxy、不可扩展对象、循环原型链(极少见但需防御)等边界情况。
基础健壮实现(属性存在性搜索)
例如:查找原型链上第一个拥有指定属性名(自有或继承)的对象:
- 先用
Object.prototype.toString.call(obj)排除原始值(如字符串、数字)——它们没有原型链 - 用
while循环 +Object.getPrototypeOf向上遍历,每次检查hasOwnProperty或prop in obj - 必须判断当前原型是否为
null,作为终止条件(原型链终点) - 避免无限循环:若发现重复出现的原型(可用
WeakSet缓存已访问对象),立即退出
示例代码:
function findInPrototypeChain(obj, prop) {if (obj == null || typeof obj !== 'object') return null;
const visited = new WeakSet();
let current = obj;
while (current !== null) {
if (visited.has(current)) break;
visited.add(current);
if (prop in current) return current;
current = Object.getPrototypeOf(current);
}
return null;
}
支持多种匹配策略的通用函数
把“搜索条件”抽象为函数,提升复用性与健壮性:
- 接受一个
matcher函数,入参为当前原型对象,返回布尔值 - 内置常用 matcher 工厂:如
hasProperty('x')、isInstanceOf(Date)、hasOwnMethod('toString') - 可选返回全部匹配项(而非首个),或返回匹配路径(原型数组)
- 对 Proxy 对象,
Object.getPrototypeOf仍可安全调用(规范保证),无需特殊处理
这样既保持语义清晰,又避免为每种需求重复写遍历逻辑。
注意不可忽略的细节
- 不要修改原型链本身:搜索过程应完全只读;若需“注入”行为,请用装饰器或组合,而非污染原型
-
区分
in与hasOwnProperty:前者查整个链,后者只查自身 —— 根据需求选对操作符 -
ES6+ 类的静态方法不在原型链上:静态成员属于构造函数自身,不参与
getPrototypeOf遍历 -
Symbol 属性同样可被继承:使用
Object.getOwnPropertySymbols+getPrototypeOf链式遍历时需额外处理

















