Udacity ES6课程:重写Vehicle基类构造函数的Bicycle子类问题
问题分析与修复方案
咱们来一步步拆解你的Bicycle子类代码没通过检测的原因,以及怎么修复:
核心问题点
构造函数参数顺序与父类不匹配
父类Vehicle的构造函数参数顺序是color, wheels, horn,但你的子类构造函数参数是wheels, horn,调用super(wheels, horn)时,相当于把wheels的值传给了父类的color参数,horn传给了父类的wheels参数,父类的horn参数则变成了undefined——这直接导致color的默认值完全失效。未给所有参数设置默认值
检测要求子类构造函数要为color, wheels, horn都设置默认值,但你的代码里:- 没有
color参数,自然没法保留父类的默认蓝色; wheels和horn也没设置默认值,当你创建无参实例时,这两个参数会是undefined,虽然你之后手动赋值了,但此时父类的构造逻辑已经错误执行,而且color已经变成了undefined,不符合默认值要求。
- 没有
没必要手动覆盖属性
你在super之后手动给this.wheels和this.horn赋值,其实完全可以通过super直接传递正确的默认值来完成初始化,这样更符合类继承的规范。
修复后的正确代码
class Bicycle extends Vehicle { // 保留color参数并继承父类默认值,同时修改wheels和horn的默认值 constructor(color = 'blue', wheels = 2, horn = 'honk honk') { // 严格按照父类参数顺序传递 super(color, wheels, horn); } // 如果honkHorn方法的逻辑和父类完全一致,这个重写可以省略 honkHorn() { super.honkHorn(); } }
验证效果
- 当你创建无参实例
const bike = new Bicycle()时,bike.color是'blue',bike.wheels是2,bike.horn是'honk honk',完全符合检测要求; - 如果你需要自定义属性,比如
const redBike = new Bicycle('red', 3),此时redBike.color是'red',wheels是3,horn依然保持默认的'honk honk',灵活性也没问题。
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

