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
相关产品推荐
相关产品推荐

