安全扩展 array 应优先创建子类(如 numarray),避免污染原生原型;若必须扩展 prototype,需检查方法存在性、加前缀、设 enumerable: false,并确保链式调用返回正确实例类型,提供卸载机制。

直接往 Array.prototype 上挂方法风险高,容易引发命名冲突、破坏其他库行为,甚至在严格模式下报错。安全扩展的关键不是“能不能加”,而是“怎么加得可控、可查、可卸载”。
只在必要时扩展,优先用自定义类封装
多数场景下,应避免动内置原型。推荐创建继承自 Array 的子类,把新方法放在子类原型上:
-
不污染全局:所有实例都是你控制的类型,不影响原生
[]行为 -
语义清晰:比如
class NumArray extends Array,天然表明这是带数学能力的数组 -
可继承复用:后续还能继续派生
SortedArray、VectorArray等
若必须扩展 Array.prototype,务必做存在性检查
每次添加前确认方法名未被占用,避免覆盖已有方法(包括其他库注入的):
- 用
if (!('myUnique' in Array.prototype))判断,比typeof Array.prototype.myUnique === 'undefined'更可靠(能捕获undefined值或已定义为undefined的情况) - 生产环境建议加前缀,如
$$unique或_myUnique,降低冲突概率 - ES6+ 可配合
Object.defineProperty设置enumerable: false,防止被for...in遍历到
链式调用要保持 this 指向数组实例
想让 [1,2,3].myFilter().myMap() 成立,每个插件方法必须返回 this,且不能改变原数组结构:
- 过滤类方法(如
myFilter)应返回新数组实例:return new Array(...filtered)或return this.constructor.from(filtered),确保子类调用后仍保留子类类型 - 避免直接修改
this.length或用splice等会破坏原型链的操作 - 对传入参数做类型校验,比如
if (!Array.isArray(this)) return,防止被非数组对象误调用
提供插件卸载机制(高级但实用)
大型项目中,可记录所添加的方法名,在需要时还原原始状态:
- 扩展前缓存原方法:
const original = Array.prototype.myUnique - 添加后暴露一个
uninstall函数,恢复为original或delete Array.prototype.myUnique - 结合模块系统(如 ES Module),让插件按需导入导出,不自动执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











