最稳妥标准的方式是将方法添加到构造函数的prototype上,所有实例通过原型链自动共享;需避免直接赋值整个prototype或在prototype上放置可变引用类型。

直接往构造函数的 prototype 上添加方法,是最稳妥、最标准的方式。所有已存在和后续创建的实例,都会通过原型链自动访问它,实现真正共享。
把方法挂到构造函数的 prototype 上
这是唯一推荐的常规做法。不是给某个实例加,也不是改实例自身的 __proto__,而是统一在构造函数的 prototype 对象上定义:
- 每次调用实例的方法时,引擎先查实例自身,没找到就顺着
__proto__找到Constructor.prototype - 所有实例的
__proto__都指向同一个prototype对象,所以它们自然共用上面的方法 - 代码清晰、性能好、符合语言设计本意
运行时修改 prototype,所有实例立即生效
prototype 是普通对象,可以随时增删改,改动会实时反映在所有实例上:
- 比如重写
Person.prototype.sayHello,之前创建的a和b调用时立刻执行新逻辑 - 新增方法也一样,比如
Person.prototype.walk = function() {...},所有实例马上能用 - 注意不要直接赋值整个
prototype(如Person.prototype = {...}),否则会切断已有实例的原型链接
避免踩坑的两个关键点
共享行为的前提是“不破坏原型链”,这两点容易出错:
立即学习“Java免费学习笔记(深入)”;
- 不要在
prototype上放可变引用类型(如数组、对象),否则多个实例会意外共享同一份数据 - 不要用
Object.setPrototypeOf()或操作__proto__去改单个实例的原型——这不是共享,而是绕过机制,影响性能且不可预测
本质上,共享靠的是“一个 prototype 被多个实例的 __proto__ 同时指向”,而不是靠复制或临时绑定。只要守住这个结构,方法自然就共享了。


















