Допустим я использую следующий код для создания объекта newCar :
const vehicleFactory = function (config) {
const MoveBehaivor = {
move(){
console.log('move')
}
}
const vehicle = Object.assign({},MoveBehaivor)
return vehicle
}
let newCar = vehicleFactory()
newCar.move() // 'move'
Здесь все просто - задаем поведение , создаем объект (если надо то с параметрами из конфига) и возвращаем
Теперь вносим изменение в фабрику так , чтобы начать производить танки .
При этом нам надо чтобы вновь созданный объект танк бладал тем же методом .move() но при этом более специализированным (уточненным).
Можно ввести обект TankMoveBehaivor с полностью переопределенным методом move() и использовать его :
const vehicleFactory = function (config) {
const MoveBehaivor = {
move(){
console.log('move')
}
}
const TankMoveBehaivor = {
move(){
console.log('move')
console.log('as tank') // отличие от метода для автомобилей
}
}
switch (config.type) {
case 'car' :
const car = Object.assign({},MoveBehaivor)
return car
case 'tank' :
const vehicle = Object.assign({},TankMoveBehaivor)
return vehicle
}
}
Но если метод move() большой и сложный то при дублировании его получится много повторного кода , чего конечно хотелось бы избежать
При использовании классовой нотации можно было бы создать class Vehicle от которого class Car и class Tank унаследовали бы метод move(),
уточняя его при необходимости.
Как сделать тоже самое используя только вышеописанный паттерн ?