Created
October 18, 2017 16:59
-
-
Save prof3ssorSt3v3/14e0432af3add454f59d7ffcc0e18ee4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// inherit-compose.js | |
// Inheritance vs Composition | |
//INHERITANCE | |
// Character > Human > Sam | |
// Character > Robot > x73 | |
// Character > Cyborg > Dolph | |
const Character = { | |
talk: function(...msg){ | |
console.log( msg.join(' ') ) | |
} | |
} | |
const Human = Object.create(Character, { | |
speed: {value:3}, | |
name: {value:'Hector'} | |
}); | |
Human.walk= function(){ | |
this.talk(this.name, 'walking') | |
}; | |
Human.eat= function(){ | |
this.talk(this.name, 'eating') | |
}; | |
const Robot = Object.create(Character, { | |
speed: {value:8}, | |
id: {value:'THX1138'} | |
}); | |
Robot.drive= function (){ | |
this.talk(this.id, '\u26A1', 'driving') | |
}; | |
Robot.wifi= function (){ | |
this.talk(this.id, '\u26A1', 'connecting') | |
}; | |
const sam = Object.create(Human, | |
{name:{value: 'Samuel'}}); | |
sam.walk(); | |
sam.talk('Hello from Samuel.'); | |
const x73 = Object.create(Robot, | |
{id:{value: 'x73'}}); | |
x73.drive(); | |
x73.wifi(); | |
// ????What about a Cybernetically enhanced human with wifi? | |
//COMPOSITION | |
const talker = (state)=>({ | |
talk: (...msg)=> console.log( msg.join(' ')) | |
}); | |
const walker = (state) => ({ | |
walk: ()=> { | |
let nm = state.name || state.id; | |
console.log(nm, 'walking'); | |
} | |
}); | |
const eater = (state) => ({ | |
eat: ()=> { | |
let nm = state.name || state.id; | |
console.log(nm, 'eating'); | |
} | |
}); | |
const driver = (state) => ({ | |
drive: ()=>{ | |
let nm = state.name || state.id; | |
console.log(nm, '\u26A1', 'driving'); | |
} | |
}); | |
const wifier = (state) => ({ | |
wifi: ()=>{ | |
let nm = state.name || state.id; | |
console.log(nm, '\u26A1', 'connecting'); | |
} | |
}); | |
const Person = (name, speed=3) => { | |
let state = { | |
name, | |
speed | |
} | |
return Object.assign({}, | |
talker(state), | |
walker(state), | |
eater(state)); | |
}; | |
let Bob = Person('Bob'); | |
Bob.talk('Hello from Bob.'); | |
Bob.eat(); | |
Bob.walk(); | |
const Android = (id, speed=6) => { | |
let state = { | |
id, | |
speed | |
} | |
return Object.assign({}, | |
talker(state), | |
driver(state), | |
wifier(state)); | |
}; | |
let k45 = Android('k45'); | |
k45.drive(); | |
k45.wifi(); | |
const Cyborg = (name, speed) => { | |
let state = { | |
name, | |
speed | |
}; | |
return Object.assign({}, | |
talker(state), | |
walker(state), | |
wifier(state)); | |
}; | |
let Dolph = Cyborg('Dolph', 9); | |
Dolph.walk(); | |
Dolph.wifi(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment