JavaScript原型支持运行时动态扩展:直接向构造函数prototype添加方法或属性,所有新旧实例即时生效;需防范原生原型污染,优先用工具函数;工厂函数+混入可按需生成子类;Object.setPrototypeOf可临时切换原型链。

JavaScript 原型对象支持运行时动态加载扩展方法,核心在于直接向构造函数的 prototype 添加属性或方法——所有已存在和后续创建的实例会立刻获得新能力,无需重建对象。
直接挂载到 prototype 实现即时生效
只要获取到目标构造函数(如自定义类、Array、String 等),就能随时往其 prototype 上写入新方法:
-
Person.prototype.sayHi = function() { return `Hi, ${this.name}` }; → 已创建的
const p = new Person('Tom')立刻可调用p.sayHi() -
Array.prototype.last = function() { return this[this.length - 1] }; → 所有现存数组(如
[1,2,3].last())马上可用 - 新增数据属性也有效:
String.prototype.isEmail = function() { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this) };
安全加载:避免冲突与污染
动态加载脚本时扩展原型,必须防范命名冲突和全局污染:
- 对原生构造函数(
Array、Object、String)扩展前先检测:if (!Array.prototype.flatMap) { Array.prototype.flatMap = ... } - 优先封装为工具函数或模块导出,而非直接修改原生原型:
utils.arrayLast(arr)比arr.last()更可控 - 若需增强语义又不想暴露,可用 Symbol 属性或私有字段模拟,不侵入原型链
按需组合:用工厂函数动态构建子类
面对多变行为需求(如“仅带验证”“带缓存+日志”的不同实例),可借助工厂函数 + 混入(mixin)方式动态生成子类:
- 定义纯函数式混入:
function withValidation() { this.validate = function() { ... }; } - 工厂内部用
class extends Base {}创建子类,再调用withValidation.call(SubClass.prototype)注入方法 - 保证原型链完整,支持
instanceof和反射工具遍历,同时不改动基类
谨慎切换原型链(非常规但有时必要)
已有对象临时需要某类能力,可用 Object.setPrototypeOf 动态重设其 [[Prototype]]:
const obj = { 0: 'a', 1: 'b', length: 2 };Object.setPrototypeOf(obj, Array.prototype);obj.push('c'); // 成功调用原生数组方法- 注意:该操作不可逆、影响性能,仅适合特定场景(如 polyfill 或调试),不推荐用于常规逻辑


















