You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript类继承疑问:两类写法是否等价及super()规避方法

嘿,作为编程新手碰到类继承的问题太正常啦,我来帮你把这两个问题理清楚~

关于JavaScript类继承的两个问题解答

一、两个Person类写法是否等价?

首先看你给出的代码:第一个Person类是完整的,第二个类的代码没写完(this.name = "...这里断了)。如果第二个类补全后,constructor里的属性赋值和第一个完全一致,并且也包含printMyname方法,那这两个类的写法是等价的。但如果第二个类缺了方法或者属性赋值不完整,那自然就不等价啦。

另外提个小细节:你代码里的male没加引号,会被当作变量处理,如果没有提前定义这个变量,运行时会报错,应该改成this.gender = 'male'或者this.gender = "male"哦。

二、如何在constructor中避免调用super()?

在JavaScript的类继承规则里,有明确的要求:

  • 如果子类定义了自己的constructor,那么必须在访问this之前调用super(),否则会抛出错误。
  • 那什么时候可以不用手动写super()呢?有两种情况:

1. 子类不定义自己的constructor

如果你不需要在子类里自定义构造逻辑,完全可以省略constructor,JavaScript会自动为你生成一个默认的构造函数,里面会自动调用super(),并且把传入的参数全部传给父类的构造函数。比如:

class Person extends Human {
  printMyname() {
    console.log(this.name);
  }
}

这段代码等价于:

class Person extends Human {
  constructor(...args) {
    super(...args);
  }
  printMyname() {
    console.log(this.name);
  }
}

2. 让子类constructor返回一个独立对象(不推荐)

另一种极端情况是,让子类的constructor返回一个不依赖this的对象,这种情况下可以不用调用super(),但这样做的话,子类的实例不会继承父类的任何属性和方法,完全变成了一个自定义对象,基本失去了继承的意义,所以很少这么用。示例:

class Person extends Human {
  constructor() {
    // 不调用super(),直接返回一个对象
    return { gender: 'male', name: 'shivom' };
  }
  printMyname() {
    console.log(this.name);
  }
}
// 此时new Person()得到的是返回的那个对象,不会有printMyname方法,也不继承Human的属性

总结一下:如果想正常实现继承,并且需要自定义构造逻辑,那super()是必须调用的;如果不需要自定义构造逻辑,省略constructor就不用手动写super()啦。


内容的提问来源于stack exchange,提问作者user9504869

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:01:00