原型属性修改会实时影响所有子实例,因为实例共享同一原型对象且属性访问是动态查找过程;直接修改构造函数prototype上的属性或方法(如添加、覆盖、修改基础类型)可实时生效,而实例自身赋值等操作会遮蔽原型属性。

原型属性的修改会实时影响所有子实例,是因为这些实例共享同一个原型对象。只要修改的是原型上的属性(而非实例自身属性),所有通过该原型创建的实例在访问该属性时,都会沿着原型链查找到被修改后的值。
哪些修改能实时生效
只有直接修改构造函数的 prototype 对象上的属性或方法,才会被所有实例共享并实时反映:
- 添加新方法:
Person.prototype.sayHi = function() { console.log('Hi'); }; - 覆盖已有方法:
Person.prototype.greet = function() { console.log('Hello!'); }; - 修改基础类型属性:
Person.prototype.version = '2.0';(后续新建或已存在的实例读取都得到 '2.0') - 修改引用类型属性需谨慎:
Person.prototype.data = [1];→ 后续Person.prototype.data.push(2)会让所有实例看到[1, 2]
为什么实例能立刻感知变化
因为 JavaScript 属性访问是动态查找过程:每次读取 instance.prop 时,引擎按顺序检查:
- 先看
instance自身是否有prop - 没有则顺着
instance.__proto__(即Constructor.prototype)查找 - 找到就返回,未找到继续向上(如
Object.prototype),直到null
所以只要原型上对应属性被改了,下一次访问就会拿到新值——无需刷新、重建或重新赋值。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
哪些情况不会影响子实例
以下操作不触发共享更新,属于“遮蔽”行为,只作用于当前实例:
- 给实例直接赋值:
person1.name = 'Tom';→ 此后person1.name读取的是自身属性,不再查原型 - 用
Object.defineProperty在实例上定义同名属性(且writable: false等) - 使用
delete person1.prop删除实例属性后,再次访问才会重新走原型链
实际验证示例
运行这段代码就能直观看到实时影响:
function Cat(name) { this.name = name; }
Cat.prototype.sound = 'meow';
const cat1 = new Cat('Lily');
const cat2 = new Cat('Milo');
console.log(cat1.sound); // 'meow'
console.log(cat2.sound); // 'meow'
Cat.prototype.sound = 'purr'; // 修改原型属性
console.log(cat1.sound); // 'purr' ← 立刻变
console.log(cat2.sound); // 'purr' ← 立刻变

















