原型链深度检测函数旨在验证instanceof、object.getprototypeof()、isprototypeof()在跨realm、proxy、object.create(null)等场景下是否按标准行为暴露原型链,而非单纯返回数字深度。

原型链深度检测函数不是为了“测出数字”,而是帮你看清标准 API 在虚拟继承场景下是否按预期暴露行为——比如 instanceof、Object.getPrototypeOf()、isPrototypeOf() 这些接口,在跨 Realm(如 iframe)、动态代理、或 Object.create(null) 等非标准原型起点时,会不会断裂、误判或静默失败。
明确检测目标:三个关键行为点
写检测函数前,先锁定你要验证的 API 行为:
-
instanceof 的判定路径是否完整:它只查
left.__proto__链是否包含right.prototype,不关心构造函数是否存在或是否可访问;若子类在 iframe 中定义,其prototype和父类不在同一全局环境,===比较就失效 -
Object.getPrototypeOf() 是否返回预期对象:对普通对象、数组、Date 等内置类型,它应稳定返回对应原型(
Array.prototype、Date.prototype);但对Object.create(null)创建的对象,它返回null,这是合法终点,不是错误 -
isPrototypeOf() 是否穿透代理和包装:如果用
new Proxy(target, handler)包裹一个对象,其isPrototypeOf()调用仍应反映原始原型链——但若 handler 拦截了getPrototypeOf,结果可能被篡改
手写一个可调试的深度遍历函数
这个函数不追求一行返回深度值,而是逐层打印路径、标注关键节点类型,方便你对照标准判断异常:
function inspectPrototypeChain(obj, maxDepth = 10) {
const chain = [];
let current = obj;
let depth = 0;
while (current !== null && depth chain.push({
depth,
value: current,
type: current === Object.prototype ? 'Object.prototype' :
current === Array.prototype ? 'Array.prototype' :
current === Function.prototype ? 'Function.prototype' :
current.constructor?.name || 'anonymous',
isNullProto: Object.getPrototypeOf(current) === null
});
current = Object.getPrototypeOf(current);
depth++;
}
if (current !== null) chain.push({ depth, value: '…(truncated)', type: 'overflow' });
return chain;
}
调用示例:inspectPrototypeChain(new Date()) 会清晰列出从 Date 实例 → Date.prototype → Object.prototype → null 的每一步,并标出哪一层是内置原型、哪一层是终结点。
针对虚拟继承的典型验证场景
所谓“虚拟继承”,常指不通过 class extends 或 Object.create(Parent.prototype) 显式连接,而是靠运行时动态设置或跨环境桥接。这时要重点验证:
-
iframe 中构造函数的 prototype 是否能被主页面 instanceof 识别:不能直接用
child instanceof Parent,因为两个Parent是不同函数;应改用Parent.prototype.isPrototypeOf(child),它只依赖原型对象引用,不依赖构造函数身份 -
Proxy 对象的原型链是否被拦截影响:给
handler.getPrototypeOf返回自定义值,会导致Object.getPrototypeOf(proxy)返回假值,但proxy instanceof X可能仍走原逻辑(取决于引擎实现),这种不一致就是需要检测的“表现偏差” -
Object.setPrototypeOf(obj, null) 后的行为:此时
obj原型链断在null,obj.toString()会报错(因找不到Object.prototype.toString),但Object.getPrototypeOf(obj) === null为真——这属于标准行为,不是 bug
别依赖 __proto__,优先用标准 API
__proto__ 是非标准、已废弃的访问器,部分环境(如严格模式下的某些旧引擎)禁止赋值,且性能较差。所有检测逻辑应基于:
-
Object.getPrototypeOf(obj)—— 获取上一级原型 -
Object.setPrototypeOf(obj, proto)—— 设置原型(仅限调试,生产慎用) -
proto.isPrototypeOf(obj)—— 判断是否在原型链中(比 instanceof 更底层、更可靠) -
Object.getOwnPropertyNames(proto)—— 查看该层实际挂载了哪些属性,确认方法是否真实存在而非被遮蔽
这样写出的检测函数,才能真正反映标准 API 在复杂继承结构下的真实表现,而不是被语法糖或历史兼容层掩盖问题。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











