extends 是对原型链的语法封装,核心是让子类复用父类逻辑并保持语义清晰;子类必须通过 class child extends parent 声明,且 constructor 中需先调用 super() 初始化 this,再扩展自身属性与方法。

用 extends 建立继承链,核心是让子类复用父类逻辑,同时保持语义清晰、行为可预测。它不是新机制,而是对原型链的语法封装,关键在于理解“先有父类实例,再加工”的执行顺序。
明确继承关系与基础写法
子类通过 class Child extends Parent 声明继承,自动获得父类原型上的所有实例方法、静态方法、getter/setter 和构造逻辑。这种写法直接表达“Child 是一种 Parent”的语义,比 ES5 手动操作 prototype 更直观。
- 父类必须存在且为函数(或 class),不能是 undefined 或 null
- 一个类只能
extends一个父类(ES6 不支持多继承) - 若父类有 constructor,子类必须在自己的 constructor 中调用
super(),否则 new 实例会报错
正确初始化 this:super() 必须在 this 前调用
子类 constructor 中,super() 不是可选操作——它是创建 this 的前提。ES6 继承机制规定:子类实例的 this 来源于父类构造函数返回的对象,子类 constructor 只负责后续加工。
- 错误写法:
this.name = 'xxx'出现在super()之前 → 报ReferenceError - 正确顺序:先
super(...args),再初始化子类专属属性(如this.breed) - 传递参数要匹配父类 constructor 签名,比如
super(name)而非super()(除非父类无参)
复用与重写:用 super 调用父级逻辑
子类可以覆盖父类方法,但不必完全抛弃原有行为。通过 super.methodName(),可在新逻辑中精准复用父实现,避免重复代码或逻辑断裂。
- 在实例方法中,
super.speak()指向父类原型上的speak - 在静态方法中(ES2022+),
super.create()可调用父类静态方法 - 重写时注意返回值和副作用:比如
speak()里先super.speak()再补充日志,就兼顾了继承与扩展
验证与调试:确认继承链是否生效
运行时可通过标准 API 检查继承结构,避免“写了 extends 却没真正连上”的隐性问题。
-
instanceof:子类实例既是子类也是父类的实例(dog instanceof Dog && dog instanceof Animal) -
Object.getPrototypeOf(Child) === Parent:确认子类构造函数的原型指向父类 -
Child.prototype.__proto__ === Parent.prototype:验证实例方法继承路径











