JavaScript中Array实例的原型链为:arr → Array.prototype → Object.prototype → null,该结构确保方法复用与类型系统连贯性,所有对象最终继承自Object.prototype并以null终止。

JavaScript 中内置构造函数如 Array 的原型链,是语言对象模型的底层骨架,它不是随意拼凑的,而是严格遵循“实例 → 构造函数原型 → 上级原型 → … → null”这一层级结构设计的。
Array 实例的完整原型链路径
当你写 const arr = [1, 2, 3],这个数组实例的原型链是:
-
arr自身(拥有length、索引属性等) - →
arr.__proto__ === Array.prototype(提供push、map、forEach等所有数组方法) - →
Array.prototype.__proto__ === Object.prototype(提供toString、hasOwnProperty、isPrototypeOf等通用方法) - →
Object.prototype.__proto__ === null(链的终点)
你可以用 Object.getPrototypeOf(arr) 逐层验证,结果依次是 Array.prototype、Object.prototype、null。
为什么 Array.prototype 要指向 Object.prototype?
这是为了实现方法复用和语义统一:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 所有对象(包括数组)都应能调用
toString(),但数组的toString行为和普通对象不同(如[1,2,3].toString() === '1,2,3'),所以Array.prototype自己重写了该方法 - 而像
hasOwnProperty这类通用能力,不需要每个内置类型都重复实现,直接从Object.prototype继承即可 - 这种设计让
instanceof Object对所有对象(含数组、函数、日期等)都返回true,保持类型系统的连贯性
Function 和 Array 的原型链有何不同?
关键差异在起点和中间节点:
-
函数实例(如
const fn = () => {}):fn → Function.prototype → Object.prototype → null -
数组实例(如
const arr = []):arr → Array.prototype → Object.prototype → null - 注意:
Array本身是个函数,所以Array.__proto__ === Function.prototype;而Array.prototype是个普通对象,不是函数,所以它的__proto__指向Object.prototype,不指向Function.prototype
可以安全修改内置原型吗?
技术上可以,但需谨慎:
- 给
Array.prototype添加方法(如Array.prototype.last = function() { return this[this.length - 1] }),所有数组实例立刻可用 - 但不要覆盖已有方法(如重写
push),可能破坏依赖原行为的库或框架 - 避免污染全局:优先用
class extends Array或工具函数封装,而非直接扩展原生原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










