es6子类重写父类方法需方法名完全相同,参数签名建议一致以保障可替换性,返回值语义应兼容;javascript无访问修饰符和类型强制,依赖约定或ts约束;重写后需用super显式调用父类方法。

子类重写父类方法时,ES6 并不强制要求访问修饰符(如 public/private)或返回值类型完全一致——因为 JavaScript 是动态弱类型语言,本身没有原生的访问控制关键字(如 private、protected),也没有编译期类型检查。但实际开发中常借助 TypeScript 或约定来保障一致性,而纯 JS 中需靠逻辑和规范来约束。
方法名与参数签名必须保持兼容
重写的核心前提是“可替换性”:子类实例应能无缝替代父类实例使用。因此:
- 方法名必须完全相同(大小写敏感)
- 参数个数、顺序建议一致;若子类减少参数,调用时可能出错;若增加可选参数(如
method(a, b = 1)),通常安全 - 虽然 JS 不校验参数类型,但若父类方法预期接收
string,子类却处理number,容易引发运行时异常
返回值无需严格匹配,但应语义一致
JS 不限制返回类型,但为保证多态调用稳定:
- 如果父类方法明确返回一个对象(如
{ status: 'ok' }),子类最好也返回结构相似的对象,避免调用方.status报错 - 若父类返回
Promise,子类也应返回 Promise(哪怕包装一下),否则链式调用(.then())会中断 - 返回
undefined或null替代预期值,属于隐性破坏,需特别注意
访问权限靠约定和工具保障,非语法强制
ES6 class 原生只支持 public 成员(包括方法)。所谓“私有方法”需借助:
-
#name私有字段(ES2022+):仅限类内访问,子类无法继承也无法重写该私有方法 - 下划线前缀(如
_helper()):纯约定,提示“不建议外部/子类调用”,但语法上仍可重写 - TypeScript 的
private/protected:仅在编译期报错,运行时无效;protected方法允许子类重写,private则不允许(TS 编译器会拦截)
正确调用父类同名方法需显式使用 super
若子类重写后仍需复用父类逻辑,必须主动调用:
- 在实例方法中用
super.methodName() - 在构造函数中必须先调用
super(),否则无法访问this - 静态方法中也可用
super.staticMethod()(前提是父类该方法是静态的) - 注意:
super指向父类的原型,不是父类实例











