extends是javascript类继承的核心关键字,用于复用父类属性方法并支持扩展覆盖;应避免深层继承(超两层),优先组合代替继承,子类须调用super(),重写方法宜增强而非替换,注意静态方法与私有字段的继承限制。

extends 是 JavaScript 中构建类继承关系的核心关键字,它让子类能复用父类的属性和方法,同时支持按需扩展或覆盖。要实现简洁、可维护的类继承体系,关键不在“多层嵌套”,而在“职责清晰”和“复用合理”。
用 extends 继承,但避免深层继承链
深度超过两层的继承(如 A → B → C → D)容易导致逻辑分散、调试困难、修改牵一发而动全身。建议:
- 优先考虑组合(composition)代替继承:把可复用行为抽成独立类或工具函数,通过实例持有而非 extends 延伸
- 若必须多级继承,确保每一层只解决一个明确问题(例如:Animal → Mammal → Dog,每层增加一类语义特征)
- 子类构造函数中必须调用 super(),且在访问 this 前完成,否则报错
重写方法时,有节制地使用 super
子类可以覆盖父类方法,但多数场景下更适合“增强”而非“替换”。比如日志记录、参数预处理、结果后置处理:
- 用 super.methodName() 显式调用父逻辑,再追加子类行为
- 避免在子类中完全重写父方法却忽略其核心功能(除非设计上就是替代)
- 注意异步方法中 super 调用的返回值类型一致性(例如都返回 Promise)
静态方法与实例方法的继承规则要分清
extends 默认继承父类的静态方法(可通过 SubClass.staticMethod() 调用),但不会自动绑定 this;实例方法则由 new 出的实例继承。常见误区:
- 静态方法不能通过 this 访问实例属性,适合工具型逻辑(如工厂创建、类型判断)
- 若需在子类静态方法中复用父类静态逻辑,仍可用 super.staticMethod()
- 不推荐在静态方法里直接操作实例状态——这违背静态语义
搭配 class 字段与私有字段,控制继承边界
ES2022+ 支持私有字段(#name)和公有字段(name = value),它们影响继承的可见性:
- 私有字段(#xxx)**不可被子类访问**,强制封装,避免子类意外依赖内部实现
- 公有字段在 constructor 中初始化更可控;直接声明(name = 'x')会在每次实例化时执行,适合默认值
- getter/setter 可用于对继承属性做拦截或转换,比直接暴露字段更安全
不复杂但容易忽略:简洁的继承不是少写 extends,而是让每一次 extends 都有明确的抽象意义,其余复用交给组合、模块或函数。











