共享方法必须挂载到构造函数的 prototype 上而非构造函数内部;否则每个实例重复创建函数,浪费内存且无法继承,而 prototype 挂载可确保函数引用相同、this 正确指向实例。

在构造函数中“挂载”共享方法,其实是个常见误解——共享方法不能在构造函数内部定义,而必须挂到构造函数的 prototype 上。构造函数本身只负责初始化实例属性,不是存放公共方法的地方。
为什么不能在构造函数里定义方法
以下写法会让每个实例都创建一份新函数,失去共享意义:
this.sayHi = function() { return `Hi, ${this.name}` }class User { constructor() { this.save = () => { ... } } }
这样不仅浪费内存,还导致子类无法继承、修改一处不生效、instance1.sayHi === instance2.sayHi 为 false。
正确做法:统一挂到 prototype 上
构造函数定义后,直接向其 prototype 添加方法:
立即学习“Java免费学习笔记(深入)”;
- 函数声明方式:
Person.prototype.sayHi = function() { ... } - 批量添加:
Object.assign(Person.prototype, { save() {}, validate() {} }) - class 语法中,普通方法(非静态、非箭头)自动挂载:
class Person { sayHi() { ... } }等价于手动挂prototype
验证是否真正共享
可通过两个关键点确认:
-
console.log(a.sayHi === b.sayHi)返回true→ 同一个函数引用 -
a.sayHi()输出Hi, A,b.sayHi()输出Hi, B→this正确指向各自实例
注意 this 和数据来源
原型方法里的 this 指向调用它的实例,所以只能安全访问实例自有属性(如 this.name、this.id),不能依赖构造函数内的局部变量或闭包。若需私有状态,应通过实例属性暴露(如 this._token),而非闭包捕获。


















