最直接有效的方式是手动遍历 object.getprototypeof() 逐级获取原型直至 null,并格式化输出;推荐用循环实现,避免依赖 console.dir 的默认折叠行为。

在控制台清晰打印对象的完整原型链,最直接有效的方式是手动遍历 __proto__(或用 Object.getPrototypeOf()),逐级获取并格式化输出,避免依赖 console.dir 的默认折叠行为。
用循环 + Object.getPrototypeOf 逐级打印
这是最可靠、兼容性好、语义清晰的方法:
- 从目标对象开始,每次调用
Object.getPrototypeOf(obj)获取其原型 - 直到返回
null(即到达原型链终点)为止 - 对每层原型使用
console.log或带缩进的console.table增强可读性
function logPrototypeChain(obj) {
let i = 0;
let current = obj;
while (current !== null) {
console.log(`[${i++}]`, current);
current = Object.getPrototypeOf(current);
}
}
logPrototypeChain({a: 1}); // 依次打印:对象本身 → Object.prototype → null
用 console.dir 配合展开选项(适合快速查看)
console.dir(obj, { depth: null }) 可强制展开所有嵌套层级,但它不显示原型链本身,只展开对象自有属性和可枚举原型属性(且受浏览器限制)。若想看原型链,仍需配合 __proto__ 展开或切换到“Prototype”面板(Chrome/Firefox 开发者工具中点击对象后,在右侧“Properties”标签页下拉到底部可见 __proto__ 链)。
封装成可读性更强的树状结构(含构造函数名)
增强信息量:显示每层的 constructor.name 和是否为原生原型:
function printProtoChain(obj) {
const chain = [];
let current = obj;
while (current !== null) {
const ctor = current.constructor?.name || '(anonymous)';
const isNative = current === Object.prototype || current === Array.prototype || current === Function.prototype;
chain.push(`${ctor}${isNative ? ' ← native' : ''}`);
current = Object.getPrototypeOf(current);
}
console.log('Prototype Chain:', chain.join(' ← '));
}
printProtoChain([1,2,3]); // 输出:Array ← Object ← null
注意避开常见坑
-
obj.__proto__是非标准但广泛支持的属性,推荐优先使用Object.getPrototypeOf(obj) - 箭头函数、某些内置对象(如
JSON)没有prototype属性,但仍有原型(如JSON.__proto__指向Object.prototype) - 不能用
for...in遍历原型链——它只枚举可枚举属性,不是原型引用本身
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











