JavaScript数组方法定义在Array.prototype上,通过原型链被所有数组实例共享调用;数组实例的__proto__指向Array.prototype,从而复用方法、节省内存,并支持类数组对象借用。
javascript 数组方法(如 push、map、filter 等)本身并不直接属于某个数组实例,而是定义在 array.prototype 上——这是原型链中关键的一环。它们能被所有数组调用,靠的正是原型链的属性查找机制。
数组方法都挂在 Array.prototype 上
每个通过 [] 或 new Array() 创建的数组,其内部 __proto__ 都指向 Array.prototype。这个对象里预置了全部标准数组方法:
-
Array.prototype.push、pop、shift、unshift -
Array.prototype.map、filter、reduce、forEach -
Array.prototype.includes、indexOf、slice、concat等
这意味着你调用 [1,2,3].map(...) 时,引擎先在数组实例自身找 map,没找到,就顺着 __proto__ 去 Array.prototype 找到并执行它。
原型链让数组方法天然可复用且节省内存
如果每个数组都自己存一份 map 函数,1000 个数组就得创建 1000 份相同逻辑的函数副本。而挂载在 Array.prototype 上后:
- 所有数组共享同一份方法实现,不重复分配内存
- 方法体只存在一处,修改
Array.prototype.map(不推荐)会影响所有数组行为 - 符合 JavaScript “基于原型的共享”设计哲学,轻量又动态
数组方法依赖原型链才能跨类型“借用”
某些类数组对象(如 arguments、NodeList)没有自己的 map,但可以通过原型链“借”来用:
Array.prototype.map.call(arguments, fn)-
[].slice.call(nodelist)(本质是调用Array.prototype.slice)
这之所以可行,是因为 Array.prototype 方法内部只依赖 this 的长度和索引访问能力,不强绑定“必须是真实数组”,只要对象结构兼容,就能沿原型链触发正确逻辑。
注意:原型链终点决定方法可用性边界
数组的原型链是:myArr → Array.prototype → Object.prototype → null
所以数组既能用 Array.prototype 上的方法(如 push),也能用 Object.prototype 上的方法(如 toString、hasOwnProperty)。但像 Object.prototype.hasOwnProperty 这类方法,对数组调用时需小心——它查的是数组自身的属性(如 length 或手动添加的键),不是元素值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











