JavaScript中原型属性实现共享的关键是将属性挂载到构造函数的prototype上,使所有实例通过__proto__指向同一原型对象,从而共享方法、静态配置及可变状态;但实例专属数据必须在构造函数内用this赋值,避免相互干扰。

JavaScript 中原型属性实现所有实例共享同一份引用,关键在于把数据或方法挂到构造函数的 prototype 上,而不是写在构造函数内部。这样所有通过 new 创建的实例,都会通过隐式原型链(__proto__)指向同一个原型对象,自然共用其中的属性和方法。
为什么 prototype 能共享同一份引用
每个函数创建时,JS 引擎自动为其添加 prototype 属性,它指向一个普通对象;这个对象就是“共享池”。所有实例的 __proto__ 在 new 时被自动设为指向该 prototype。因此:
- 多个实例访问
Person.prototype.say,实际读取的是内存中同一个函数对象; - 访问
Person.prototype.sharedArray,拿到的是同一个数组引用; -
p1.sharedArray === p2.sharedArray返回true,说明它们指向同一块内存。
哪些内容适合放在 prototype 上共享
适合放上去的,是那些所有实例都一致、不随个体变化的数据或行为:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 通用方法(如
toString、save、validate); - 静态配置(如
defaultOptions、API_BASE_URL); - 可变但需全局同步的状态(如缓存池
cacheMap、计数器instanceCount); - 注意:如果放的是对象或数组,修改它会影响所有实例——这是共享引用的本意,也是常见陷阱。
避免误用:别把实例专属数据放 prototype
把实例独有数据(如姓名、ID)写在 prototype 上,会导致所有实例互相干扰:
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:
Person.prototype.name = 'unknown'→ 所有实例读this.name都可能从原型上取到相同值; - ✅ 正确:
this.name = name写在构造函数内,确保每个实例拥有独立副本; - 若真需要默认值,可用逻辑判断:
return this.name || Person.prototype.defaultName。
验证共享是否生效的简单方式
可以通过引用相等性或状态联动来确认:
- 方法共享:
new A().foo === new A().foo应为true; - 对象共享:
const a = new A(); const b = new A(); a.cache.push(1); console.log(b.cache)会输出[1]; - 检查原型链:
Object.getPrototypeOf(a) === A.prototype应为true。

















