javascript原型链通过__proto__逐级向上访问,终点为object.prototype.__proto__ === null;所有内置构造函数实例(如array、regexp)的原型链最终都指向object.prototype,而function构造函数自身形成闭环。

可以通过 __proto__ 一层层向上访问,直到到达 Object.prototype,这条链路就是 JavaScript 中的原型链。关键在于理解:所有内置构造函数(如 Array、RegExp)的实例,其原型最终都指向 Object.prototype,而 Object.prototype.__proto__ 是 null,表示链路终点。
Array 实例的原型链路径
创建一个数组后,它的 __proto__ 指向 Array.prototype;而 Array.prototype.__proto__ 指向 Object.prototype;再往上就没了。
-
[].__proto__ === Array.prototype(true) -
Array.prototype.__proto__ === Object.prototype(true) -
Object.prototype.__proto__ === null(true)
RegExp 实例的原型链路径
正则表达式实例同理,只是中间多了一层 RegExp.prototype,但它也直接继承自 Object.prototype。
-
/a/.__proto__ === RegExp.prototype(true) -
RegExp.prototype.__proto__ === Object.prototype(true) -
Object.prototype.__proto__ === null(true)
为什么不是所有内置对象都“直达” Object.prototype?
像 Date、Function、Error 等,它们的 .prototype 都直接以 Object.prototype 为原型;但 Function 是个特例:它的实例(即函数)本身也是对象,所以 Function.prototype.__proto__ 是 Object.prototype,而 Function.__proto__(注意这是构造函数自身)指向 Function.prototype,形成闭环。
- 普通实例(如
new Date())→Date.prototype→Object.prototype→null - 构造函数自身(如
Date)→Function.prototype→Object.prototype→null
实际追踪技巧
在控制台中可逐级打印验证,避免手动写太多 .__proto__:
- 用
Object.getPrototypeOf(obj)替代obj.__proto__(更规范、兼容性更好) - 写个小循环递归取
getPrototypeOf,直到返回null - 注意:箭头函数没有
prototype属性,但仍有__proto__,它指向Function.prototype











