extends 是语法糖,通过 object.setprototypeof 自动建立子类与父类的实例原型链和构造函数继承链,并要求子类 constructor 中必须调用 super() 初始化 this。

extends 关键字在 JavaScript 中并不直接操作原型链,而是通过构造函数的 prototype 和内置的 Object.setPrototypeOf() 机制,自动建立子类与父类之间的原型关系,确保实例能沿链访问父类方法和属性。
子类 constructor 的 prototype 指向父类 prototype
当使用 class Child extends Parent 时,JavaScript 引擎会执行类似以下逻辑:
- 创建
Child.prototype对象(默认是空对象) - 调用
Object.setPrototypeOf(Child.prototype, Parent.prototype),使子类原型的[[Prototype]]指向父类原型 - 这样,
new Child()实例的__proto__→Child.prototype→Parent.prototype→Object.prototype,形成完整链
子类 constructor 本身继承父类静态方法
除了实例原型链,extends 还设置构造函数间的继承关系:
- 执行
Object.setPrototypeOf(Child, Parent),让子类函数对象的[[Prototype]]指向父类函数 - 因此
Child.someStaticMethod()可以访问Parent.someStaticMethod() - 静态属性/方法也遵循原型链查找规则
super() 调用触发父类构造逻辑,并绑定 this
在子类 constructor 中,必须显式调用 super()(否则报错),它完成两件事:
- 执行父类构造函数,初始化父类实例属性
- 确保
this正确指向当前正在构建的实例(ES6 类中this在super()前未定义) - 若不调用
super(),后续对this的访问会抛出ReferenceError
手动模拟 extends 的关键步骤(仅用于理解)
虽然不推荐手写,但可帮助看清本质:
- 定义父类函数:
function Parent(name) { this.name = name; } - 定义子类函数:
function Child(name, age) { Parent.call(this, name); this.age = age; } - 手动链接原型:
Object.setPrototypeOf(Child.prototype, Parent.prototype); - 修复 constructor:
Child.prototype.constructor = Child; - 此时
new Child()的原型链与class Child extends Parent行为一致
本质上,extends 是语法糖,背后由引擎保障两条关键链路:实例原型链(__proto__ 层级)和构造函数继承链(constructor 的 [[Prototype]])。只要遵循 class 语法规则,原型关联就自动正确。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











