避免原型共享引用类型修改影响所有实例的关键是让每个实例操作独立副本,最可靠方式是在构造函数中初始化引用属性,如this.items = []; 类字段语法和getter返回新对象也能有效隔离实例数据。

原型上共享引用类型(如数组、对象、Map)本身不是问题,问题是修改它会波及所有实例。避免篡改的关键不是“禁止修改”,而是**不让修改操作作用在共享引用上**——让每个实例操作自己的副本。
构造函数内初始化引用属性
这是最常用、最可靠的方式。每次 new 都执行构造函数,自然为每个实例创建独立引用。
- ✅ 正确写法:this.items = []; 或 this.config = {}; 写在构造函数里
- ❌ 错误写法:MyClass.prototype.items = []; —— 所有实例共用一个数组,push 一次,全员可见
- 子类继承时,记得在子构造函数中调用 Parent.call(this),确保父类的初始化逻辑生效
用类字段语法替代 prototype 挂载
ES6+ 类中,直接写字段比手动在 prototype 上定义更安全、更直观。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- class Button { cache = new Map(); options = { size: 'md' }; }
- 这等价于在 constructor 中赋值,天然隔离实例数据
- ⚠️ 注意别写成 static cache = new Map(),那是真正的全局共享
用 getter 返回新对象(适合默认配置)
当属性是只读或需按需生成时,getter 能彻底切断引用共享。
- get defaults() { return { timeout: 3000, retries: 2 }; }
- 每次访问都返回全新对象,修改它不会影响其他实例
- 不适合需要长期持有并反复修改的缓存类数据(比如 this.logHistory),因为每次取都是新数组
深拷贝输入数据,不直接合并到实例
从接口或外部接收数据后,别用 Object.assign(this, data) 直接覆盖——若 data 含 __proto__ 或嵌套引用,可能污染原型或共享状态。
- 推荐用 structuredClone(data)(现代环境)做深拷贝再赋值
- 老环境可用 JSON 方案(注意 function/Date/undefined 等限制)
- 或白名单方式手动提取字段:this.name = data.name; this.id = data.id;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










