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
相关产品推荐
相关产品推荐

