https://www.youtube.com/watch?v=wfMtDGfHWpA
class MurderRobotDog {
constructor(name) {
this.name = name
}
drive() {
const {name} = this
console.log(`${name}: ππ¨π¨`)
}
bark() {
const {name} = this
console.log(`${name}: woof`)
}
kill() {
const {name} = this
console.log(`${name}: πͺππͺππ©Έ`)
}
}
class Robot {
constructor(name) {
this.name = name
}
drive() {
const {name} = this
console.log(`${name}: ππ¨π¨`)
}
}
class MurderRobot extends Robot {
constructor(name) {
super(name)
}
kill() {
const {name} = this
console.log(`${name}: πͺππͺππ©Έ`)
}
}
class CleaningRobot extends Robot {
constructor(name) {
super(name)
}
clean() {
const {name} = this
console.log(`${name}: π§Ήπ§Ήπ§Ήπ§Ή`)
}
}
class Animal {
constructor(name) {
this.name = name
}
poop() {
const {name} = this
console.log(`${name}: π©π©π©`)
}
}
class Dog extends Animal {
constructor(name) {
super(name)
}
bark() {
const {name} = this
console.log(`${name}: woof`)
}
}
class Cat extends Animal {
constructor(name) {
super(name)
}
meow() {
const {name} = this
console.log(`${name}: meow`)
}
}
const dog = new Dog('Bello π')
dog.bark()
dog.poop()
const cat = new Cat('Garfield π')
cat.meow()
cat.poop()
const cleaner = new CleaningRobot('Clark π§Όπ€')
cleaner.drive()
cleaner.clean()
const killer = new MurderRobot('Joe π¦Ύπ€')
killer.drive()
killer.kill()
const killerRobotDog = new MurderRobotDog('Lise π¦Ύπ€π')
killerRobotDog.drive()
killerRobotDog.bark()
killerRobotDog.kill()
const barker = (state) => ({
bark: () => {
console.log(`${state.name}: woof`)
}
})
const meower = (state) => ({
meow: () => {
console.log(`${state.name}: meow`)
}
})
const pooper = (state) => ({
poop: () => {
console.log(`${state.name}: π©π©π©`)
}
})
const driver = (state) => ({
drive: () => {
console.log(`${state.name}: ππ¨π¨`)
}
})
const cleaner = (state) => ({
clean: () => {
console.log(`${state.name}: π§Ήπ§Ήπ§Ήπ§Ή`)
}
})
const killer = (state) => ({
kill: () => {
console.log(`${state.name}: πͺππͺππ©Έ`)
}
})
const dogFactory = (name) => {
const state = {
name
}
return Object.assign(
{},
barker(state),
pooper(state)
)
}
const catFactory = (name) => {
const state = {
name
}
return Object.assign(
{},
meower(state),
pooper(state)
)
}
const cleanerRobotFactory = (name) => {
const state = {
name
}
return Object.assign(
{},
cleaner(state),
driver(state)
)
}
const killerRobotFactory = (name) => {
const state = {
name
}
return Object.assign(
{},
driver(state),
killer(state)
)
}
const killerRobotDogFactory = (name) => {
const state = {
name
}
return Object.assign(
{},
killer(state),
driver(state),
barker(state)
)
}
const dog = dogFactory('Bello π')
dog.bark()
dog.poop()
const cat = catFactory('Garfield π')
cat.meow()
cat.poop()
const cleanerRobot = cleanerRobotFactory('Clark π§Όπ€')
cleanerRobot.drive()
cleanerRobot.clean()
const killerRobot = killerRobotFactory('Joe π¦Ύπ€')
killerRobot.drive()
killerRobot.kill()
const killerRobotDog = killerRobotDogFactory('Lise π¦Ύπ€π')
killerRobotDog.drive()
killerRobotDog.bark()
killerRobotDog.kill()