Как переопределить конструктор базового класса в Javascript

#javascript #constructor #overriding #es6-class

#javascript #конструктор #переопределение #es6-класс

Вопрос:

В обучении Udacity ES6 возникает вопрос о переопределении конструктора базового класса. У меня есть решение, но Udacity не позволяет мне выйти сухим из воды.

Задание таково: создайте подкласс Bicycle, который расширяет класс Vehicle. Подкласс Bicycle должен переопределить функцию конструктора транспортного средства, изменив значения по умолчанию для колес с 4 на 2 и звукового сигнала с «beep beep» на «honk honk».

 class Vehicle {
    constructor(color = 'blue', wheels = 4, horn = 'beep beep') {
        this.color = color;
        this.wheels = wheels;
        this.horn = horn;
    }

    honkHorn() {
        console.log(this.horn);
    }
}

// your code here


/* tests
const myVehicle = new Vehicle();
myVehicle.honkHorn(); // beep beep
const myBike = new Bicycle();
myBike.honkHorn(); // honk honk
*/
 

Решение, которое я придумал, это:

 class Bicycle extends Vehicle {
    constructor(wheels, horn){
        super(wheels, horn)
        this.wheels = 2
        this.horn = "honk honk" 
    }

    honkHorn(){
        super.honkHorn()
    }

}
 

Но этого недостаточно, и я не понимаю, почему это так. Обратная связь, которую я получил, такова:

Ваш конструктор велосипедов не устанавливает значения по умолчанию для цвета, колес и звукового сигнала

Комментарии:

1. Я думаю, что упражнение ожидает, что вы установите значения по умолчанию для всех аргументов конструктора даже в вашем классе Bicycle. Что-то вроде этого: jsfiddle.net/nf570m4k

2. расширяя приведенный выше ответ (на вашем велосипеде) constructor(wheels = 2, horn = 'tring tring')

Ответ №1:

вы не должны использовать

     this.wheels = 2
    this.horn = "honk honk" 
 

когда они уже переопределены в суперконструкторе.

 class Vehicle {
	constructor(color = 'blue', wheels = 4, horn = 'beep beep') {
		this.color = color;
		this.wheels = wheels;
		this.horn = horn;
	}

	honkHorn() {
		console.log(this.horn);
	}
}

class Bicycle extends Vehicle {
	constructor(wheels = 2, horn = 'honk honk') {
		super(undefined, wheels, horn);
	}

	honkHorn() {
		super.honkHorn()
	}

}

let by = new Bicycle();
by.honkHorn(); 

Комментарии:

1. вы пробовали удалить «это»? колеса = 2 это. horn = «honk honk» ` из Bycible constructor . @Edwin

2. Вы также не должны устанавливать значение color как undefined. Это не позволит вам отправлять сообщения с цветом, установленным на неопределенный. Просто используйте: class Bicycle extends Vehicle { constructor(color, wheels = 2, horn = "honk honk") { super(color, wheels, horn); }

Ответ №2:

 class Bicycle extends Vehicle {
    constructor(wheels =2, horn= "honk honk"){
        super(undefined, wheels, horn)
    }

    honkHorn(){
        super.honkHorn()
    }

}
 

затем для теста я добавил:

 const yourBike = new Bicycle(3, "tring tring")
 

Хотя другие варианты действительно давали правильные ответы для тестовых примеров, описанных в вопросе. Добавив этот дополнительный тест, я обнаружил, что переопределение конструктора базового класса невозможно ни из super, ни из this.колеса (как и моя первая попытка).

Однако Udacity не принимает его……