在 JavaScript 中,通过构造函数的 prototype 属性动态添加公共方法是最经典方式,所有实例(含已创建的)立即共享;可用 Object.assign 批量添加,但避免重写整个 prototype 或扩展内置原型。

在 JavaScript 中,通过构造函数的 prototype 属性动态添加公共方法,是最经典、最直接的方式。所有该构造函数创建的实例都能立即共享新添加的方法(包括已创建的实例),无需重新实例化。
直接在 prototype 上添加方法
这是最常用的做法:给构造函数的 prototype 对象添加函数属性。
function Person(name) {
this.name = name;
}
<p>// 动态添加公共方法
Person.prototype.sayHello = function() {
return <code>Hello, I'm ${this.name}</code>;
};</p><p>const p1 = new Person('Alice');
const p2 = new Person('Bob');</p><p>console.log(p1.sayHello()); // "Hello, I'm Alice"
console.log(p2.sayHello()); // "Hello, I'm Bob"
✅ 已存在的实例(如 p1、p2)也能立即使用新方法,因为它们的 [[Prototype]] 指向 Person.prototype,而 JS 在运行时会沿着原型链查找。
批量添加多个方法(用 Object.assign)
避免重复写 Constructor.prototype.xxx = ...,可一次性注入多个方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
Object.assign(Person.prototype, {
walk() { return `${this.name} is walking`; },
talk(words) { return `${this.name} says: "${words}"`; },
getName() { return this.name; }
});
<p>console.log(p1.walk()); // "Alice is walking"
console.log(p2.talk('Hi there!')); // "Bob says: "Hi there!""
⚠️ 注意:Object.assign 是浅拷贝,适用于方法对象;不推荐用于添加带 this 依赖的箭头函数(箭头函数无法正确绑定实例上下文)。
运行时动态补丁已有类(含内置类)
可在任意时刻为(自定义或内置)构造函数的原型添加方法,实现“运行时扩展”:
- 为自定义类追加功能(比如后期引入日志能力):
// 后期补充调试方法
Person.prototype.debugInfo = function() {
console.log('Current instance:', this);
};
- 甚至可以扩展内置类型(谨慎使用):
// 不推荐但技术上可行:给 Array 原型加方法
Array.prototype.last = function() {
return this[this.length - 1];
};
console.log([1, 2, 3].last()); // 3
⚠️ 扩展内置原型存在风险(可能与其他库冲突、违反规范),生产环境应避免;若必须,建议用 Symbol 或封装工具函数替代。
注意事项与常见误区
-
不要重写整个 prototype:如
Person.prototype = {...}会切断已有实例的原型链,导致它们无法访问新方法; - 方法内 this 指向调用者实例,不是构造函数本身;
-
ES6 class 本质相同:class 的
method() {}语法最终也挂载到ClassName.prototype上,所以同样支持后续动态添加; - 严格模式下不能给 null/undefined 的 prototype 赋值,确保构造函数有合法 prototype 对象。

















