Skip to content

Instantly share code, notes, and snippets.

@dominikkaegi
Created March 15, 2021 21:06
Show Gist options
  • Save dominikkaegi/ed76b2cb7cfa02cb6b42ab858568c041 to your computer and use it in GitHub Desktop.
Save dominikkaegi/ed76b2cb7cfa02cb6b42ab858568c041 to your computer and use it in GitHub Desktop.

Composition > Inheritance

https://www.youtube.com/watch?v=wfMtDGfHWpA

Inheritance

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()

Composition

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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment