可以直接在内置类prototype上添加方法,所有该类型实例立即可用;推荐用Object.assign批量挂载,避免全量赋值破坏原型链;需谨慎使用以防覆盖原生方法或引发兼容性问题。

可以直接在内置类(如 String、Array、Number 等)的 prototype 上添加方法,所有该类型的实例立即可用。这是最直接、最广泛支持的动态扩展方式。
往内置类 prototype 添加方法
JavaScript 所有内置构造函数(String、Array、Date、Number 等)都拥有 prototype 对象,你只需向其添加函数属性,就能让所有已有和新建的实例访问到新方法。
- 添加后,已有实例无需重建,即可调用新方法
- 方法内部
this自动绑定为当前实例(例如字符串、数组等),行为与原生方法一致 - 注意避免重名,否则会覆盖原生方法(如不小心覆盖了
Array.prototype.map就会导致严重问题)
示例:给 String 添加首字母大写方法
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
};
console.log("hello".capitalize()); // "Hello"
</script>
批量添加多个方法(推荐用于插件或工具库)
使用 Object.assign 一次性挂载多个自定义方法,语义清晰、不易出错,且不会替换整个 prototype(避免破坏 constructor 引用或原型链)。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 保持
prototype对象引用不变,不影响已存在的实例隐式原型 - 适合封装成工具包,比如
String.prototype.extend(...)风格的增强集合 - 不建议用
String.prototype = {...}全量赋值,会切断原有原型链
示例:为 Array 批量添加实用方法
Object.assign(Array.prototype, {
isEmpty() { return this.length === 0; },
first() { return this[0]; },
last() { return this[this.length - 1]; }
});
console.log([1, 2, 3].last()); // 3
console.log([].isEmpty()); // true
</script>
注意事项与风险提示
虽然技术上可行,但为内置类扩展需格外谨慎:
- 仅在必要场景使用(如 Polyfill 缺失 API、团队统一工具层),避免污染全局环境
- 不要覆盖标准方法(如
Array.prototype.push),除非你完全理解其规范行为和副作用 - 某些环境(如严格模式、某些框架沙箱)可能限制对内置原型的修改
- 第三方库可能依赖原生行为,擅自扩展可能引发兼容性问题
替代方案:更安全的封装方式
若担心全局污染,可用以下方式替代:
- 创建工具函数:如
capitalize(str),而非挂到String.prototype - 使用类包装器:如
class SafeString extends String { ... } - 采用静态工具对象:如
StrUtils.capitalize("hello")
这些方式不修改原生对象,更适合大型项目或协作环境。

















