super不是语法糖,而是类定义时静态确立、运行时严格绑定的机制:构造器中super()激活this并调用父类构造函数;实例方法中super.xxx只查父类原型;静态方法中super指向父类构造函数本身。

super 不是 prototype 的语法糖,也不是调用父类原型的快捷写法。它是一套由类定义时静态确立、运行时严格绑定的机制,行为取决于上下文——构造器、实例方法、静态方法,三者中 super 的语义和目标对象完全不同。
super() 在构造器中:激活 this,不创建新实例
子类构造函数首行必须调用 super()(或 super(args)),否则会报 ReferenceError: Must call super constructor before accessing 'this'。这不是风格约定,而是引擎强制规则:
- new 表达式先生成一个空对象,this 初始未绑定;super() 的作用是把该空对象作为 this,传入父类 constructor 执行初始化
- super() 内部的 this 始终指向子类实例(不是父类实例),父类构造函数中的 this === 当前子类实例
- new.target 在整个继承链中始终是子类构造函数,哪怕在父类 constructor 内也保持不变
- super() 之后 this 才被“激活”,才能访问 this.xxx;提前读写直接报错
super.xxx 在实例方法中:只查 Parent.prototype,不越界
在普通实例方法里,super.xxx 是语法级限定访问,等价于从 Parent.prototype 开始查找,不会继续向上遍历原型链:
- super.getName() → 查找 Parent.prototype.getName,找不到就是 undefined,不会 fallback 到 this.getName 或 Object.prototype.getName
- super.xxx = val 实际赋值目标仍是当前子类实例(即 this.xxx = val),不会修改 Parent.prototype
- 它依赖 this 存在,但不是 this 的代理;不能访问父类构造函数里用 this.x = … 动态添加的属性(那些属于实例,不在 prototype 上)
- 箭头函数中禁止使用 super,因其无词法环境,无法解析绑定
super.xxx 在静态方法中:直连父类构造函数,与实例无关
在 static 方法中,super 指向的是父类构造函数本身(即 Parent),而非其 prototype:
立即学习“Java免费学习笔记(深入)”;
- super.create() 等价于 Parent.create(),纯粹类层级调用,不涉及 this、不依赖实例
- 引擎通过 [[HomeObject]] 在方法定义时就锁定父类引用,与运行时有无实例完全无关
- super 在静态上下文中和字面量 Parent 地位相当,可用于复用静态工具、工厂方法、常量等
- 若 Parent.x 是实例属性(非 static),super.x 在静态方法中一定为 undefined —— 它根本不看实例部分
prototype 直接调用:手动绕过 super 限制,但失去语义保障
你可以手动写 Parent.prototype.method.call(this) 或 Object.getPrototypeOf(Object.getPrototypeOf(child)).method.call(child),但这和 super 有本质区别:
- super 是编译期确定的、与类结构强绑定的语法;prototype 调用是运行时动态表达,需你手动维护继承层级
- super 在不同上下文自动切换目标(prototype / 构造函数),prototype 调用永远只指向某个固定对象
- super 支持赋值(super.x = v)、方法调用(super.m())、甚至 super.constructor(虽极少用),而 prototype 调用只能用于方法或属性读取
- super 参与 new.target 和 this 绑定规则,prototype 调用则完全脱离这些机制
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/123690.html