super是基于this的父类上下文代理,不改变this指向;它以子类实例为调用主体查找并执行父类原型上的方法或属性,其中this仍为子类实例。

super 本身不改变 this 的指向,它只是访问父类成员的语法糖;this 在子类方法中始终指向当前实例,和是否使用 super 无关。
super 不是独立对象,而是基于 this 的父类上下文代理
当你写 super.method() 或 super.prop 时,JavaScript 引擎会以当前 this(即子类实例)为调用主体,去查找父类原型上的对应方法或属性。也就是说:
- 执行的是父类的方法,但
this仍是子类实例(不是父类实例) - 父类方法内部若访问
this.xxx,读取/修改的是子类实例上的属性(除非被子类覆盖) - 不能用
super给父类私有字段赋值(如super.#private无效),也不能用super当作普通对象传参或赋值给变量
正确访问父类属性和方法的常见方式
在子类构造函数或方法中,通过 super 调用父类逻辑,关键在于理解“谁调用、在哪找、绑定谁”:
-
super()只能在子类构造函数中调用,用于初始化父类的this(必须在使用this前调用) -
super.method()在任意实例方法中可用,等价于Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this, ...) -
super.prop访问父类原型上的 getter/setter 或自有属性(仅限可枚举、非私有) - 若父类方法依赖
this.constructor,注意子类实例的constructor指向子类,不是父类
容易误解的典型场景
比如父类有 getName() 返回 this.name,子类重写了 name 属性:
- 调用
super.getName()→ 执行父类方法,但this.name读的是子类实例的name(因为this没变) - 若想强制读父类自己的
name,需在父类中用闭包、Symbol 或私有字段封装,不能靠super切换this -
super无法访问父类构造函数内定义的实例属性(如this.parentId = 1),只能访问定义在原型链上的成员
替代方案:需要真正切换 this 时怎么办
如果确实需要以父类视角操作某个对象(比如复用父类逻辑但绑定另一个实例),不能靠 super,而要用显式绑定:
- 用
Parent.prototype.method.call(otherThis, ...) - 用
Reflect.apply(Parent.prototype.method, otherThis, [...args]) - 避免在子类中直接修改父类原型,否则会影响所有继承者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











