super是javascript继承中绑定原型链与构造流程的核心机制:子类constructor首行必须调用super()激活this;实例方法中super.method()调用父类原型方法;静态方法中super指向父类构造函数;箭头函数禁用super;super不能读取父类实例属性,应使用this。

super 关键字是 JavaScript 类继承中不可替代的语法工具,它不是“调用父类”的快捷方式,而是与原型链和构造流程深度绑定的机制。用错位置、时机或上下文,都会直接报错或产生意外行为。
子类构造函数里必须首行调用 super()
只要子类显式定义了 constructor,就必须在第一行写 super() 或 super(args),否则会立即抛出 ReferenceError: Must call super constructor before accessing 'this'。
- super() 的作用是把 new 创建的空对象作为 this,传入父类 constructor 执行初始化
- 调用后,this 才被“激活”,之后才能给 this.age、this.name 赋值
- 参数通常原样传递,也可加工后再传,确保父类属性正确设置
实例方法中用 super.method() 复用父逻辑
当子类重写父类方法(比如 speak()),又需要保留原有行为时,用 super.speak() 显式调用父类原型上的同名方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- super 在这里指向父类的 prototype,查找严格限定在 Parent.prototype 上,不会继续向上遍历
- 可以放在方法任意位置,常用于前置处理(如日志)、后置清理或条件增强
- super.xxx = val 实际等价于 this.xxx = val,赋值目标始终是当前子类实例
静态方法中 super 指向父类构造函数本身
在 static 方法里,super.create() 查找的是父类自身的静态成员(即 Parent.create),而不是原型链上的方法。
- 这是因为子类构造函数的 [[Prototype]] 指向父类构造函数,静态继承与实例继承彼此隔离
- 静态方法不能通过 super 访问实例方法,实例方法也不能通过 super 调用静态方法
- 箭头函数中禁止使用 super,因为它没有自己的词法环境,无法解析绑定
常见误区:super 不能读取父类实例属性
很多人误写 super.name 想访问从父类继承来的实例字段,结果是 undefined。原因很明确:
- 实例属性(如 this.name = name)是挂载在实例对象上的,不在 Parent.prototype 上
- super.xxx 的查找等价于
Object.getPrototypeOf(this).xxx,只查原型,不查实例 - 要读取继承来的实例属性,一律用 this.name,不是 super.name
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










