直接修改构造函数的 prototype 可使所有新旧实例立即获得新功能,体现原型动态性;应通过属性赋值扩展而非覆盖整个 prototype,注意命名冲突与原生对象污染风险。

直接修改构造函数的 prototype 对象,所有已存在和未来创建的实例都会立即获得新功能——这是 JavaScript 原型动态性的核心体现。
修改 prototype 是最直接的方式
只要在运行时给构造函数的 prototype 添加方法或属性,所有基于该构造函数创建的实例(包括之前已创建的)都能立刻访问到新增内容,无需重新实例化。
- 原型链查找机制保证:每次调用方法时,引擎会沿原型链向上查找,而 prototype 是实时可读的引用,不是快照
- 注意不要覆盖整个 prototype(如
Person.prototype = {...}),否则会切断已有实例的原型链连接 - 推荐用属性赋值方式扩展:
Person.prototype.sayHello = function() { ... };
适用于已有实例的典型场景
比如为已上线的类批量打补丁、注入调试方法、添加兼容性 polyfill,或根据运行时条件启用某组能力。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 示例:为所有已存在的
Array实例添加sum()方法(不推荐污染原生原型,仅作原理演示)Array.prototype.sum = function() { return this.reduce((a, b) => a + b, 0); };
此后所有数组(包括[1,2,3]这样早已创建的)都能调用.sum() - 实际项目中更常见的是自定义类:
MyWidget.prototype.renderLoading = function() { ... };,上线后热修复 UI 行为
注意原型链与 constructor 的一致性
新增方法后,instance.constructor 仍指向原构造函数,但 instance.__proto__ 已包含新属性。可通过 Object.getPrototypeOf(instance) 确认当前原型对象。
- 若需保持
constructor指向正确,新增方法时不需手动设置constructor,除非你重写了整个 prototype - 可用
hasOwnProperty或in操作符区分自有属性与原型属性:'sayHello' in obj返回 true,obj.hasOwnProperty('sayHello')返回 false
避免意外覆盖与命名冲突
动态添加功能虽灵活,但多人协作或集成第三方库时容易引发冲突。
- 建议加前缀或使用 Symbol 作为键名(如
Symbol('myPluginDoSomething')),降低全局污染风险 - 添加前可先检查是否已存在:
if (!MyClass.prototype.doX) { MyClass.prototype.doX = ... } - 对原生对象(如 Array、Object)谨慎扩展;优先考虑封装工具函数或使用代理模式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










