JavaScript原型方法共享靠实例的[[Prototype]]自动指向构造函数prototype,所有实例共用同一份函数代码且this正确绑定;添加方法必须挂到Constructor.prototype上,而非构造函数体内。

JavaScript 中原型方法在实例间共享,靠的是每个实例内部的 [[Prototype]] 链接自动指向构造函数的 prototype 对象。只要方法定义在 Constructor.prototype 上,所有实例(包括创建后动态添加的)都能访问同一份函数代码,且 this 正确绑定到调用它的实例。
为什么能共享?关键在原型链链接
每次执行 new Constructor(),引擎会自动把新对象的隐式原型(__proto__)设为 Constructor.prototype。这意味着:
- 所有实例共用同一个原型对象,不是副本
- 方法只存储一次,多个实例调用的是内存中同一个函数引用
-
obj1.method === obj2.method返回 true
怎么正确添加原型方法?
必须把方法挂到构造函数的 prototype 属性上,而不是写在构造函数体内:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐:
Person.prototype.say = function() { ... }; - ✅ 批量添加:
Object.assign(Person.prototype, { say() {}, walk() {} }); - ❌ 错误:
function Person() { this.say = function() { ... }; }—— 每个实例都新建一份,浪费内存
已有实例也能立即使用新方法
原型是“活”的对象。哪怕实例早已创建,只要后续往 Constructor.prototype 添加方法,这些实例立刻就能调用:
立即学习“Java免费学习笔记(深入)”;
- 先
const p = new Person('Tom'); - 再
Person.prototype.run = function() { console.log(this.name + ' runs'); }; - 然后
p.run()可以直接运行,无需重建实例
注意遮蔽:实例属性会覆盖原型方法
如果某个实例自己设置了同名方法,比如 p.say = function() { ... };,那么调用 p.say() 就不会再走原型链,而是执行实例自身的函数。这属于正常行为,也是实现“个性化覆盖”的基础。如需强制调用原型方法,可用:Person.prototype.say.call(p)。

















