可直接在内置构造函数prototype上添加方法,所有新旧实例立即可用;但禁止覆盖整个prototype,需检查是否被冻结,推荐条件注册并避免冲突。

可以直接往内置构造函数的 prototype 上添加方法,所有该类型的实例(包括已存在的)都会立即获得新能力。但要注意:不能覆盖整个 prototype,也不能修改被冻结的对象。
直接在 prototype 上挂载方法
这是最常用、最安全的方式。内置构造函数如 Array、String、Date 等都有可写的 prototype 对象(除非被显式冻结),你可以直接添加新方法:
Array.prototype.unique = function() { return [...new Set(this)]; };String.prototype.isEmail = function() { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this); };Date.prototype.format = function(fmt) { /* 自定义格式化逻辑 */ };
添加后,所有已有和后续创建的对应类型实例都能调用这些方法,比如 ['a','b','a'].unique() 或 'test@example.com'.isEmail()。
避免覆盖 prototype 整体
切勿使用赋值方式替换整个原型对象,例如:
Array.prototype = { unique() { ... } }; // ❌ 错误!会切断已有数组实例与原型的连接- 这样做会让已存在的数组(如
const arr = [1,2,3])无法访问原生方法(push、map等),甚至丢失constructor指向。
注意冻结和环境限制
某些运行环境(如部分浏览器严格模式或框架沙箱)可能已冻结内置原型:
- 可通过
Object.isFrozen(Array.prototype)检查是否可写 - 若返回
true,则Array.prototype.xxx = ...会静默失败(非严格模式)或抛错(严格模式) - Node.js 和现代浏览器通常允许扩展,但生产环境建议谨慎使用,避免与其他库冲突
推荐封装成可选插件
为降低风险,可把扩展逻辑包装成条件注册函数:
- 先检测方法是否已存在:
if (!String.prototype.includes) { ... } - 用
Object.defineProperty控制属性特性(如不可枚举、不可配置) - 或只在需要时临时扩展,用完即删(不推荐长期维护)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











