安全重写指在子类原型上定义同名方法,仅影响该子类,不破坏原型链、不污染父类;须针对父类prototype上的方法,避免修改实例方法或内置原型。

子类对父类方法的安全重写,核心是“在子类原型上定义同名方法”,同时确保不破坏原型链结构、不污染父类、并能按需调用父类逻辑。关键不在“能不能覆盖”,而在于“覆盖得是否可控、可追溯、不影响其他实例”。
明确重写的对象:只针对 prototype 上的方法
只有定义在父类 prototype 上的方法(如 Parent.prototype.render)才属于原型链继承的范畴,才存在“被子类重写”的语义。如果父类在构造函数里用 this.handleClick = function() {...} 挂载,那它属于实例私有方法,子类修改它不会影响原型查找,也不算真正意义的“重写原型方法”。
- ✅ 安全重写目标:父类
prototype上的函数属性 - ❌ 不属于重写范畴:构造函数内
this.xxx初始化的实例方法或数据 - ⚠️ 避免重写:
Object.prototype或内置构造函数的原型(如Array.prototype),易引发全局副作用
标准重写方式:直接赋值子类 prototype 同名方法
这是最简洁、最安全的做法。只要子类原型上有同名方法,实例调用时就会优先命中它,自动阻断向上查找,无需删除或屏蔽父类方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 子类原型赋值即可:
Child.prototype.render = function() { /* 新实现 */ }; - 保持 constructor 正确性:重写后建议补一句
Child.prototype.constructor = Child;,避免后续instance.constructor指向错误 - 不推荐用
delete Child.prototype.render再定义——多余且可能干扰调试器或工具链
需要复用父逻辑时:用 super(ES6 class)或显式调用(ES5)
重写不是抛弃,而是增强。若新方法中需执行父类原有逻辑,应主动调用,而非依赖隐式继承。
立即学习“Java免费学习笔记(深入)”;
- ES6 class 中:用
super.methodName()显式调用父类方法(前提是已用extends和super()正确建立继承关系) - ES5 原型链中:保存父类引用再调用,例如
const parentRender = Parent.prototype.render; parentRender.call(this); - ⚠️ 注意:不要在子类方法里直接写
this.__proto__.__proto__.render.call(this)——耦合过强、不可维护、且在非标准环境可能失效
避免意外副作用:别让重写影响父类或其他子类
原型链上的方法是共享的,但重写操作本身只作用于当前子类原型,不会波及父类原型或其他子类——这是安全的前提。但以下情况会打破隔离:
- 误改父类原型:
Parent.prototype.render = ...→ 所有继承自 Parent 的实例都会受影响 - 在子类构造函数中给
this赋值同名方法 → 这只是覆盖实例自身属性,不改变原型链行为,也不算“重写原型方法” - 把可变对象(如
{}或[])挂到父类 prototype 上 → 子类重写方法没问题,但若子类意外修改了这个共享对象,会影响所有实例

















