javascript原型链核心是单向链表结构,每个对象仅有一个[[prototype]]指向其真实原型;通过object.getprototypeof()逐层向上遍历,可清晰追踪从实例→构造函数prototype→object.prototype→null的完整路径。

在 JavaScript 原型链中追踪复杂对象图的原型指向,核心是理解三个关键机制:构造函数的 prototype、实例的 __proto__(或 Object.getPrototypeOf()),以及内置对象间隐式的继承关系。不靠死记硬背,而靠分层观察和工具辅助,就能理清任意嵌套结构。
看清三类“原型指针”的实际归属
每个对象身上其实有两套可查的原型线索:
-
显式构造线索:通过
obj.constructor.prototype查看该对象“本应”继承自哪个原型对象(但注意:constructor可被改写,不一定可靠); -
真实继承线索:用
Object.getPrototypeOf(obj)获取对象**实际**的原型,这是最权威的指向依据; -
函数对象特殊性:函数既是对象又是构造器,所以它同时拥有
__proto__(指向Function.prototype)和prototype(供其实例继承),别混淆两者。
逐层向上遍历,避免跳步或断链
面对多层继承(如 Array → Array.prototype → Object.prototype → null),建议用循环方式手动展开:
function traceProto(obj, path = []) {
if (obj === null || obj === undefined) return path;
const proto = Object.getPrototypeOf(obj);
path.push(proto);
return traceProto(proto, path);
}
// 示例:traceProto([1,2]) 返回 [Array.prototype, Object.prototype, null]
这样能清晰看到每一步的原型值,也容易发现意外中断(比如某个中间原型被设为 null 或非对象)。
识别常见“隐形连接点”
一些原型链看似断裂,其实是被标准内置关系“悄悄接上”了:
-
Array.prototype.__proto__ === Object.prototype—— 所有数组实例最终继承自Object.prototype; -
Function.prototype.__proto__ === Object.prototype—— 函数也是对象; -
Object.prototype.__proto__ === null—— 这是整个链的终点; - 自定义类继承时,
class B extends A会让B.__proto__ === A,同时B.prototype.__proto__ === A.prototype,这是静态与实例原型的双链设计。
用浏览器开发者工具快速验证
在 Console 中输入对象后展开其 __proto__ 属性,是最直观的方式。注意两点:
- 右键对象 → “Store as global variable”(如
temp1),再执行Object.getPrototypeOf(temp1),避免鼠标悬停时临时计算带来的误导; - 对函数使用
func.toString()可确认是否为原生函数(如[native code]),原生构造器的prototype通常不可枚举,但依然存在且可访问。
原型链不是树而是单向链表,只要抓住“每个对象只有一个 [[Prototype]]”这个铁律,配合 Object.getPrototypeOf 一层层往上问,再复杂的对象图也能拆解清楚。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











