不推荐在原生内置对象原型上添加方法,应优先使用工具函数、命名空间封装和ES模块导入;需链式调用时创建包装类而非污染原型;仅在填补标准化API且满足检测、不覆盖、封闭环境三条件时才谨慎扩展。

不推荐直接在原生内置对象(如 Array、String、Date)的原型上添加方法。看似方便,实则风险高——容易与标准新特性冲突、破坏 polyfill 兼容性、干扰第三方库,甚至引发难以定位的静默错误。
优先用工具函数替代原型污染
把逻辑封装成独立、无副作用的函数,调用时显式传入数据,语义清晰且可预测:
- 写成
arrayUnique([1,2,2,3]),而不是[1,2,2,3].unique() - 使用命名空间组织,例如
Arr.filterFalsy(arr)或Str.capitalize(str) - 配合 ES 模块按需导入:
import { compact } from './utils/array.js',支持 tree-shaking
需要链式调用?选封装类而非继承
若确实需要类似 new SmartArray([1,2,3]).unique().map(x => x * 2) 的体验,应创建包装类:
- 内部持有原生实例(如
this._arr = arr),不修改Array.prototype - 所有方法返回新实例或委托结果,保持不可变性
- 可自由添加类型检查、缓存、日志等增强逻辑,TS 类型也友好
极少数必须扩展时,守住三条底线
仅当填补已标准化但环境未支持的 API(如旧浏览器缺 Array.prototype.at),且满足以下条件才考虑:
立即学习“Java免费学习笔记(深入)”;
- 先检测原生是否存在:
if (!Array.prototype.at) { Array.prototype.at = … } - 不覆盖已有方法,不添加非标准命名(避免未来和
groupBy、toSorted等冲突) - 确保只在完全可控的封闭环境运行(如无第三方脚本的内部管理后台),并配有完整测试覆盖
现代 JavaScript 开发真正提升效率的,不是让每个数组都“多一个方法”,而是清晰的模块边界、可靠的类型约束和可组合的纯函数设计。


















