JavaScript中无内置方法获取原型链深度,需用Object.getPrototypeOf()循环计数至null;健壮函数需校验null/原始值,如[]深度为2、{}为1,Object.prototype深度为0。

JavaScript 中没有直接获取原型链“深度”的内置方法,但可以通过循环遍历 __proto__ 或 Object.getPrototypeOf() 逐级向上计数,直到到达 null(即原型链终点)来动态计算。
使用 Object.getPrototypeOf() 安全遍历
Object.getPrototypeOf() 是标准、推荐的方式,避免直接访问已废弃的 __proto__。每次调用返回当前对象的原型,返回 null 表示链终止。
- 从目标对象开始,初始化计数器为
0 - 每次获取原型后,若不为
null,计数器加1 - 继续用新原型重复,直到返回
null
处理边界情况:null、原始值、内置构造器
需提前校验输入——null 和 undefined 没有原型;原始值(如字符串、数字)会被临时包装,其原型链包含 String.prototype → Object.prototype → null(共 2 层);而 Object.prototype 自身的原型是 null,深度为 0。
- 对非对象类型(如
typeof x !== 'object' || x === null),可选择抛错或返回0 -
Object.prototype的深度为0,因为它的原型就是null -
Array.prototype深度通常为1(→Object.prototype→null)
封装成可复用函数
以下是一个健壮实现:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
function getPrototypeChainDepth(obj) {
if (obj === null || typeof obj !== 'object') return 0;
let depth = 0;
let current = obj;
while ((current = Object.getPrototypeOf(current)) !== null) {
depth++;
}
return depth;
}
例如:getPrototypeChainDepth([]) 返回 2(Array.prototype → Object.prototype → null),getPrototypeChainDepth({}) 返回 1。
注意:深度 ≠ 继承层级语义
该数值仅反映从对象到 null 经过的显式原型节点数量,不体现类继承关系或 instanceof 逻辑。例如通过 Object.create(null) 创建的对象,原型为 null,深度为 0;而用 class B extends A 定义的类,实例的深度取决于 A 的原型链长度,而非 extends 层数。

















