判断原型共享隐患需四步:一查属性是否定义在prototype上;二测两实例同名引用属性是否相等(===为true即共享);三改一实例观察其他是否被动变化;四查原型链终点是否含该属性且实例自身无该属性。

看属性是否定义在 prototype 上
检查代码中有没有类似 Constructor.prototype.xxx = [] 或 Constructor.prototype.data = {} 的写法。这类赋值直接把引用类型挂到了原型对象上,所有实例都会指向同一块内存。只要出现这种模式,就极可能已埋下共享隐患。
测两个实例的同名属性是否相等
创建两个实例后,用 === 比较它们的同名引用属性:
- 如果返回 true:说明它们引用的是同一个数组或对象,正在共享
- 如果返回 false:说明是各自独立的副本,相对安全
例如:p1.hobbies === p2.hobbies 返回 true,就是典型信号。
改一个实例,观察其他实例是否被动变化
这是最直观的验证方式。对某个实例的数组执行 push、splice,或对对象执行 obj.key = value 后,立刻检查其他实例对应属性的值和结构:
- 若其他实例也出现新增项、删除项或字段变更,说明已被污染
- 基本类型(如 name、id)不受影响,可作为对照项
查原型链终点是否包含该属性
用 Object.getPrototypeOf(instance) 获取原型对象,再检查该对象上是否存在目标属性:
- 如果属性存在于原型上,而实例自身 hasOwnProperty('xxx') 返回 false,说明读写都落在原型
- 此时任何修改都会波及所有共用该原型的实例










