You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript内置类疑问:Array构造函数与原型为何有重复方法?

为什么Array构造函数和它的prototype上都有concat、filter等方法?

这个问题其实涉及到JavaScript ES6之后新增的静态方法和传统实例方法的区别,并不是同一方法重复定义在两个位置哦,它们是功能相似但调用方式、适用场景完全不同的两个方法:

  • 原型上的是实例方法:你在arr.constructor.prototype(也就是Array.prototype)看到的concat、filter这些,是数组实例专属的方法——必须通过一个具体的数组实例来调用,比如[1,2].concat([3]),它们的作用是基于当前数组实例执行操作,最终返回新的数组结果。

  • 构造函数上的是静态方法:而直接挂在Array(也就是arr.constructor)上的同名方法,是ES6之后新增的静态工具方法,不需要依赖数组实例就能调用。比如:

    // 用静态方法合并多个独立数组
    Array.concat([1,2], [3,4], [5]) // 结果: [1,2,3,4,5]
    // 用静态方法过滤数组
    Array.filter([1,2,3], item => item > 1) // 结果: [2,3]
    

这种同名设计是TC39(JavaScript标准委员会)的刻意选择:把一些常用的实例操作,同时提供静态版本,方便开发者在没有现成数组实例的场景下直接使用,比如合并多个独立数组时,不用先创建一个空数组再调用实例方法,代码会更简洁直观。

你可以在控制台验证一下,这两个同名方法其实是完全不同的函数:

console.log(Array.concat === Array.prototype.concat) // 输出: false

内容的提问来源于stack exchange,提问作者darKnight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:27:43