es6的class和extends是原型链继承的语法糖,子类prototype.__proto__指向父类prototype,子类构造函数__proto__指向父类构造函数,super()等价于parent.call(this)。

ES6 的 class 和 extends 不是新继承模型,而是原型链继承的语法糖。理解它,关键在于看清 extends 在底层如何重新组织原型关系。
子类 prototype 指向父类 prototype
当写 class Child extends Parent 时,JavaScript 引擎会自动执行类似以下操作:
- 让
Child.prototype.__proto__指向Parent.prototype - 也就是说,
Child.prototype的原型是Parent.prototype,不是Object.prototype - 因此,子类实例能沿原型链访问父类原型上的方法(如
sayName())
子类构造函数的原型指向父类构造函数
除了实例原型链,构造函数本身也有继承关系:
-
Child.__proto__指向Parent(即子类构造函数继承父类构造函数) - 这使得静态方法也能被继承:比如
Parent.sayHello()可通过Child.sayHello()调用 - 这个链接由
extends自动建立,无需手动设置Object.setPrototypeOf(Child, Parent)
super() 实际是调用父类构造函数并绑定 this
在子类 constructor 中写 super(name),等价于:
- 先确保父类构造函数被执行(初始化
this上的实例属性) - 内部调用的是
Parent.call(this, name),不是创建新对象 - 若不调用
super(),this就未定义,访问会报错
整个原型链示例(简化版)
假设有:
class Parent { constructor(n) { this.name = n; } }
class Child extends Parent { constructor(n, a) { super(n); this.age = a; } }
const c = new Child('Alice', 10);
那么它的原型链是:
c.__proto__ === Child.prototypeChild.prototype.__proto__ === Parent.prototypeParent.prototype.__proto__ === Object.prototypeObject.prototype.__proto__ === null
所以 c.sayName() 查找路径为:自身 → Child.prototype → Parent.prototype → 找到。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











