super在es6中非语法糖,而是上下文感知引用:super()调用父构造器且this指向子实例;super.xxx在普通方法中访问父原型,在静态方法中访问父类本身;有严格使用限制以保障继承语义。

super 在 ES6 继承中不是简单“调用父类”的语法糖,它的行为严格取决于使用场景——是作为函数调用(super()),还是作为对象访问(super.xxx)。底层指向和限制都源于 JavaScript 引擎对 this 绑定、原型链和执行上下文的精确控制。
super() 作为函数:指向父类构造器,但 this 指向子类实例
在子类 constructor 中,super() 必须被调用,且只能在此处使用。它本质是执行父类构造函数,但关键点在于:
- 执行的是父类的构造逻辑(如初始化
this.x、调用new.target等) - 但该函数内部的
this不指向父类实例,而是指向**正在构建的子类实例** - 所以
super()等价于Parent.prototype.constructor.call(this),而非新建一个父类对象 - 不调用
super()就访问this会直接报错:ReferenceError: Must call super constructor in derived class before accessing 'this'
super 作为对象:分场景,指向完全不同
super 不是固定指向某个对象,而是根据调用位置动态解析:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 在**子类普通方法**(非 static)中:
super指向父类的prototype(即Parent.prototype) - 在**子类静态方法**中:
super指向父类本身(即Parent构造函数) -
super.xxx只能读取/调用定义在父类原型上的属性或方法;父类构造器内定义的实例属性(如this.y = 1)无法通过super.y访问 - 通过
super.xxx = val赋值时,实际等同于this.xxx = val(因为赋值操作会触发 setter 或直接写入实例),所以super.x = 3改的是子类实例的x,不是父类原型的x
super 的硬性限制与常见陷阱
这些限制不是设计缺陷,而是为保障继承语义清晰、避免原型污染和 this 混乱:
-
super只能在 class 内部使用,不能在普通函数或顶层作用域出现 -
super()只能在子类constructor首行调用,提前或延后都会报错 -
super不能单独出现(如console.log(super)),必须带属性访问或方法调用(super.method()或super.prop) - 在对象字面量中使用
super,仅支持方法简写形式(method(){ return super.x }),不支持箭头函数或属性赋值式写法 - 若父类原型上无对应属性,
super.xxx读取返回undefined,不会沿原型链继续向上查找(区别于this.xxx)
一句话总结底层逻辑
super 是 JavaScript 引擎内置的“上下文感知引用”:它不保存真实内存地址,而是在每次使用时,根据当前执行环境(是否在 constructor、是否 static、是否在 class 内)动态计算出应访问的目标对象(Parent 或 Parent.prototype),再绑定正确的 this 执行。这种机制让继承既保持语义明确,又避免了手动 call/apply 的繁琐和错误风险。










