在构造函数原型上挂载共享方法应直接赋值给constructor.prototype,如user.prototype.greet=function(){},确保实例共用同一函数、节省内存、支持继承;class语法中普通方法自动挂载到原型;避免在构造函数内定义方法以防重复创建和失去继承能力。

在构造函数原型上挂载共享方法,核心是把函数赋值给 Constructor.prototype,而不是写在构造函数内部。这样做能让所有实例共用同一份函数代码,节省内存,也支持继承和运行时动态扩展。
直接往 prototype 上添加方法
这是最清晰、最推荐的方式。构造函数定义后,直接给它的 prototype 添加函数:
function User(name, age) {
this.name = name;
this.age = age;
}
User.prototype.greet = function() {
return `Hello, I'm ${this.name}`;
};
User.prototype.isAdult = function() {
return this.age >= 18;
};
之后每个 new User() 实例都能调用 greet() 和 isAdult(),且它们引用的是同一个函数对象(user1.greet === user2.greet 返回 true)。
用 class 语法自动挂载(ES6+)
class 中的普通方法默认就挂到原型上,无需手动操作:
class Product {
constructor(name, price) {
this.name = name;
this.price = price;
}
// ✅ 自动挂到 Product.prototype
toString() {
return `${this.name} ($${this.price})`;
}
// ✅ 同样挂到原型
isExpensive() {
return this.price > 100;
}
}
验证方式:Product.prototype.toString 是函数;new Product().hasOwnProperty('toString') 返回 false,说明不是实例自有属性。
避免在构造函数里定义方法
以下写法会导致每个实例都创建一份新函数,浪费内存,也无法被子类继承:
-
this.greet = function() { ... }(实例私有) -
greet = () => { ... }(类字段 + 箭头函数,也是实例私有)
这类写法让方法脱离原型链,instance.greet 不再通过 __proto__ 查找,子类也无法复用或覆盖它。
批量挂载多个方法(简洁写法)
初始化阶段方法较多时,可用 Object.assign 一次性写入:
Object.assign(User.prototype, {
greet() { return `Hello, ${this.name}`; },
getAgeGroup() { return this.age
<p>效果与逐个赋值完全一致,逻辑更集中,适合封装通用工具类。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











