javascript内置对象原型链本质是“构造关系+原型指向”组合:数组实例的__proto__指向array.prototype,再指向object.prototype,终点为null;函数对象的__proto__指向function.prototype,再指向object.prototype,终点同样为null。

JavaScript 内置对象的原型链本质是“构造关系 + 原型指向”的组合,数组和函数虽同为对象,但它们的构造源头、原型归属和链路终点各不相同。理解它们的关键不在死记图谱,而在抓住两条主线:谁造了它?它的原型又连向谁?
数组的原型链:Array → Object.prototype → null
一个空数组 [] 是由内置构造函数 Array 创建的实例。根据原型规则,实例的 __proto__ 指向其构造函数的 prototype:
-
Object.getPrototypeOf([]) === Array.prototype// true -
[].__proto__ === Array.prototype// true
而 Array.prototype 本身是一个普通对象(不是函数),所以它由 Object 构造,其原型自然指向 Object.prototype:
-
Object.getPrototypeOf(Array.prototype) === Object.prototype// true
最后,Object.prototype 是整条链的终点,它的原型被规范强制设为 null:
-
Object.getPrototypeOf(Object.prototype) === null// true
函数的原型链:Function → Function.prototype → Object.prototype → null
所有函数(包括 Array、Object、String 等内置函数)本身都是 Function 的实例。因此它们的 __proto__ 都指向 Function.prototype:
-
Object.getPrototypeOf(Array) === Function.prototype// true -
Object.getPrototypeOf(Function) === Function.prototype// true(Function 自身也遵循该规则)
Function.prototype 是一个特殊对象——它是个可调用的空函数,但它仍是对象,所以它的原型是 Object.prototype:
-
Object.getPrototypeOf(Function.prototype) === Object.prototype// true
同样,Object.prototype.__proto__ === null,链在此终止。
为什么 Array.prototype 不等于 Function.prototype?
因为二者角色不同:
-
Array.prototype 是供数组实例使用的“方法仓库”,比如
push、map都定义在这里; -
Function.prototype 是供所有函数实例共享的“基础行为”,比如
call、apply、bind定义于此; - 它们都继承自 Object.prototype,所以都能用
toString、hasOwnProperty等通用方法。
验证原型链的常用方式
不用依赖 __proto__(非标准但广泛支持),更推荐使用标准 API:
- 查某对象的直接原型:
Object.getPrototypeOf(obj) - 判断 A 是否在 B 的原型链上:
A.isPrototypeOf(B) - 查构造函数:
obj.constructor(注意:可被修改,不绝对可靠) - 确认是否到达终点:
Object.getPrototypeOf(Object.prototype) === null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











