构造函数的prototype能共享方法,因为所有实例的__proto__自动指向它,方法只存一份且this指向实例;错误地在构造函数内用this.方法名=fn会重复创建副本,浪费内存。

把方法写在构造函数的 prototype 上,所有实例就能共享同一份函数代码。
为什么 prototype 能共享方法
每个构造函数自带一个 prototype 对象,所有通过 new 创建的实例,其内部 __proto__ 都自动指向这个对象。这意味着:
- 方法只在内存中存一份,不随实例数量增加而重复创建
- 已有实例和后续新建的实例,都能立刻使用新添加的方法
- 调用时 this 正确指向当前实例,能访问 this.name 等自有属性
正确写法:方法必须挂到 prototype 上
不要在构造函数里用 this.方法名 = function(){},否则每个实例都有一份独立副本:
- ✅ 推荐:
Person.prototype.say = function() { console.log(this.name); }; - ❌ 避免:
this.say = function() { ... };(浪费内存,无法共享)
验证是否共享成功:new Person('a').say === new Person('b').say 返回 true。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
动态添加方法也立即生效
运行时修改 prototype,所有实例同步可用:
- 直接添加:
Person.prototype.walk = function() { ... }; - 批量添加:
Object.assign(Person.prototype, { run() {}, jump() {} }); - 注意:不要整体赋值
Person.prototype = {...},会切断已有实例的原型链
共享方法的查找规则
调用 p.say() 时,引擎按以下顺序查找:
- 先看 p 自身有没有 say 属性(自有属性优先)
- 没有就顺着 p.__proto__ 找到 Person.prototype
- 再没找到就继续向上查 Object.prototype,直到 null
所以给实例临时加同名方法会“遮蔽”原型上的版本,删掉后自动恢复使用原型方法。

















