子类继承后直接修改父类方法会同步改变所有依赖该方法的实例行为,破坏封装性与可预测性;原型链共享导致全局污染;引用类型属性被意外修改;constructor指向错乱引发识别异常;es6 class语法糖不消除底层原型副作用。

子类继承后直接修改父类方法,最核心的副作用是:所有依赖该方法的实例(包括父类和其他子类)行为同步改变,破坏封装性与可预测性。
原型链共享导致全局污染
当子类通过 Child.prototype = new Parent() 或直接赋值 Child.prototype = Parent.prototype 实现继承时,子类原型与父类原型指向同一对象。此时若执行:
Child.prototype.sayHello = function() { console.log('Child says hi'); };- 父类实例调用
sayHello也会输出 “Child says hi” - 其他继承自
Parent的子类(如Teacher)同样受影响
本质是方法被覆盖而非重写——因为它们共用一个函数对象。
引用类型属性被意外修改
若父类原型上定义了引用类型(如数组、对象),子类实例修改它会波及其他所有实例:
Parent.prototype.hobbies = ['reading'];child1.hobbies.push('coding');-
child2.hobbies立即变成['reading', 'coding']
这不是“继承出错”,而是原型共享的自然结果——所有实例通过 __proto__ 访问同一个 hobbies 数组。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
constructor 指向错乱引发识别异常
未重置 constructor 时,子类实例的 constructor 仍指向父类:
console.log(child.constructor === Parent); // true-
instanceof判断虽正确,但new child.constructor()会创建父类实例 - 序列化、调试工具或框架反射逻辑可能误判类型
这看似小问题,但在依赖构造器生成新实例的场景(如深拷贝、工厂函数)中易引发隐蔽 bug。
ES6 class 的“安全假象”需警惕
class 语法糖掩盖了底层原型操作,但副作用并未消失:
-
class Student extends Person { }仍基于Object.setPrototypeOf(Student.prototype, Person.prototype) - 若手动修改
Student.prototype.toString,Person.prototype.toString同样被替换 - 仅当使用
Object.defineProperty或独立赋值新方法时,才真正隔离
语法简洁不等于语义隔离——继承关系本身决定了原型链的连通性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










