不建议在内置对象原型上添加方法,因其会导致全局污染、版本冲突、调试困难及安全风险;应优先使用工具函数、类封装或proxy代理等隔离方案。

直接往内置对象(如 String、Array、Number)的 prototype 上添加方法,是最常用也最直接的扩展方式——但必须清楚它的影响范围和潜在风险。
给内置构造函数 prototype 添加方法
所有由该构造函数创建的实例都会继承新方法,包括字面量(如 'abc'、[1,2]),因为它们在调用方法时会自动包装为对应对象类型。
-
字符串首字母大写示例:
String.prototype.firstUpper = function() { return this.charAt(0).toUpperCase() + this.slice(1); };
之后'hello'.firstUpper()返回'Hello' -
数组判空方法:
Array.prototype.isEmpty = function() { return this.length === 0; };[].isEmpty()返回true - 注意:不能重写或替换整个
prototype(比如String.prototype = {...}),浏览器会拒绝,严格模式下直接报错
避免污染全局,用安全封装替代直接修改
直接扩展内置原型可能引发冲突(尤其在多人协作或引入第三方库时),推荐用“代理式”封装隔离风险。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 定义一个工具类或命名空间,把增强逻辑收在里面:
const Str = { upperFirst(str) { return str.charAt(0).toUpperCase() + str.slice(1); } }; - 或使用 Symbol 做私有标识,配合
Object.defineProperty控制可枚举性,降低被意外遍历到的概率 - 现代项目中更倾向用工具函数(如 Lodash 风格)而非修改原生原型,便于 tree-shaking 和维护
扩展时必须绕开的坑
看似简单,实则几个细节不注意就会出问题:
-
不要在冻结的原型上添加:如果某环境已执行
Object.freeze(String.prototype),再赋值新方法会静默失败(非严格模式)或报错(严格模式) -
避免覆盖已有方法:先检查是否已存在,比如
if (typeof String.prototype.trim !== 'function') { ... } -
注意 this 指向和类型安全:例如
Number.prototype上的方法,123.myMethod()中this是包装对象,但typeof this仍是'number';而null、undefined无法访问任何原型方法
兼容旧环境的 polyfill 写法
为缺失方法打补丁时,标准做法是先检测再定义,兼顾安全性与功能性:
if (!String.prototype.includes) { String.prototype.includes = function(search) { return this.indexOf(search) > -1; }; }- MDN 推荐 polyfill 都采用这种防御式写法,既防止重复定义,也避免覆盖已被实现的版本
- ES2015+ 新增的大多数方法(如
Array.prototype.find、String.prototype.padStart)都可用类似方式补充
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










