修改原型对象仅影响未自有同名属性的实例,新增、修改、删除原型属性会立即反映在这些实例上;若实例已设置同名属性、原型被整体替换或引用类型被重新赋值,则不受影响。

修改原型对象会影响所有尚未遮蔽该属性的已有实例,以及之后创建的所有新实例。关键不在于“改了原型”,而在于“实例是否自己拥有同名属性”。
哪些实例会立即响应修改
只要实例自身没有设置同名属性,它每次读取时都会顺着原型链找到最新值——引擎不缓存查找结果,也不复制值。
- 新增属性:如
Person.prototype.city = '杭州',所有未定义city的实例立刻能读到'杭州' - 修改属性:如
Person.prototype.age = 25,之前没设过age的实例,下次读age就是25 - 删除属性:如
delete Person.prototype.age,实例再读age会继续向上找(比如到Object.prototype),或返回undefined
哪些情况完全不受影响
原型改得再勤,也触达不到已被“隔离”的实例。
- 实例自己设置了同名属性:如
person1.age = 30,后续无论怎么改Person.prototype.age,person1.age始终是30 - 彻底替换了原型对象:如
Person.prototype = { ... },已存在的实例仍指向旧原型,新原型只对之后的new Person()生效 - 修改的是引用类型但被重新赋值:如
person1.address = { city: '德阳' },这会在实例上新建自有属性,切断与原型中address的关联
对引用类型属性要特别小心
原型上的引用类型(如对象、数组)被多个实例共享,直接改其内部属性会影响所有实例;但若用赋值方式替换整个引用,则只影响当前实例。
- 安全修改(影响全部):
Person.prototype.config.timeout = 5000 - 隔离修改(仅当前):
person1.config = { timeout: 3000 }
和框架响应式毫无关系
原型修改不会触发 Vue 的视图更新,也不会让 React 组件重渲染。它只是改变了属性查找路径,不收集依赖、不派发更新、不执行副作用函数。需要自动同步视图,必须用 ref、computed 或 useState 等响应式机制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











