Array实例原型链为数组实例→Array.prototype→Object.prototype→null,Object实例为对象实例→Object.prototype→null;两者构造函数均继承自Function.prototype。

JavaScript中,Array 和 Object 都是内置构造函数,它们的实例通过原型链最终都指向 Object.prototype,但中间路径不同——Array.prototype 是独立对象,继承自 Object.prototype,而非直接等于它。
Array 的原型链结构
Array 实例(如 [1, 2])的原型链为:
-
[1, 2].__proto__ === Array.prototype(即数组实例直接继承自Array.prototype) -
Array.prototype.__proto__ === Object.prototype(Array.prototype自身是一个普通对象,其原型是Object.prototype) -
Object.prototype.__proto__ === null(原型链终点)
因此完整链路是:数组实例 → Array.prototype → Object.prototype → null。这也解释了为什么数组既能调用 push()、map() 等数组方法,也能使用 toString()、hasOwnProperty() 等来自 Object.prototype 的方法。
Object 的原型链结构
Object 实例(如 {} 或 new Object())的原型链更直接:
立即学习“Java免费学习笔记(深入)”;
{}.__proto__ === Object.prototypeObject.prototype.__proto__ === null
所以链路是:对象实例 → Object.prototype → null。注意:虽然 Array.prototype 本身也是对象,但它不是 Object 的实例(Array.prototype instanceof Object 为 true,因为其原型链包含 Object.prototype),而 Object.prototype 是唯一不继承自任何其他对象的内置原型。
关键区别与验证方式
区分两者原型链的核心在于构造器与 __proto__ 的归属:
-
Array.prototype.constructor === Array,而Object.prototype.constructor === Object -
Array.prototype上有push、slice等特有方法;Object.prototype上有toString、valueOf、isPrototypeOf等通用方法 - 可通过
Object.getPrototypeOf([])得到Array.prototype,再对其调用Object.getPrototypeOf得到Object.prototype
另外,typeof [] === 'object',说明数组在类型系统中属于对象大类,但语义和行为由其原型链上的方法决定。
补充:Function 与原型链的关系
值得注意的是,Array 和 Object 本身都是函数(typeof Array === 'function'),所以它们也继承自 Function.prototype:
Array.__proto__ === Function.prototypeObject.__proto__ === Function.prototypeFunction.prototype.__proto__ === Object.prototype
这意味着构造函数(如 Array、Object)作为函数值时,其原型链与普通函数一致,而它们创建的实例则走另一条(实例化后的)原型链。










