完全覆盖父类功能指子类同名方法彻底取代父类方法,不调用super、不复用逻辑;静态方法覆盖同理;instanceof仍反映继承关系。

完全覆盖父类功能,就是让子类方法彻底取代父类同名方法的行为,不调用、不复用父类逻辑——这在 ES6 中只需直接重写方法即可,不需要 super,也不需要额外操作。
直接定义同名方法即完成覆盖
只要在子类中声明一个与父类同名的方法(包括参数签名),运行时就会优先使用子类版本,父类方法被“遮蔽”,不会自动执行。
- 覆盖是静态的:编译/解析阶段就确定了调用哪个方法,不是运行时动态选择
- 不影响父类本身:父类实例调用该方法,仍执行原始逻辑
- 无需 super:不写 super.xxx(),就不会触发父类代码
构造函数里也要注意“完全接管”
如果想连初始化逻辑也完全替换,子类需定义自己的 constructor,并且可以不调用 super()——但这样会失去继承能力,导致 this 不可用,通常不推荐。
- 若保留 extends,就必须在 constructor 第一行调用 super(),否则报错
- 若真要彻底切断继承关系,就不该用 extends,而改用组合或手动设置原型
- 所谓“完全覆盖”,一般指行为层面,而非强行破坏继承链
静态方法覆盖更简单
静态方法默认被继承,子类定义同名 static 方法,就直接替代父类版本,无任何隐式调用。
- Parent.do() 和 Child.do() 是两个独立方法,互不影响
- Child.do() 执行时,不会自动跑 Parent.do(),除非你显式写 super.do()
- 没定义时,Child.do() 会沿 __proto__ 链向上找到 Parent.do()
instanceof 仍反映真实继承关系
即使所有方法都被覆盖,实例依然属于子类,也仍是父类的 instance —— 因为 extends 建立的原型链没变。
- new Child() instanceof Child → true
- new Child() instanceof Parent → true
- 覆盖方法不改变原型链结构,只改变具体函数引用


















