Zdravim mam jednu otazku v JavaScripte ohladom best practice ako riesit "povod" objektu.
Chcem sa vyhnut OOP strukture a objekt vznika funkcionalne kompoziciou funkcionalit, ktore ma vediet.
Priklad: Chcem spravit Hikera a ten ma vediet sa predstavit a cestovat, pridelia sa mu teda metody introduce a travel s prislusnymi properties.
const introducer = (state) => ({
name: state.name,
introduce: () => console.log(`I am ${state.name}`)
})
const traveler = (state) => ({
place: state.place,
travel: (destination) => {
state.place = destination
console.log(`I have arrived at ${state.place}`)
}
})
function hikerFactory(name, place) {
let state = {name, place}
return Object.assign(
state,
introducer(state),
traveler(state)
)
}
var johny = hikerFactory('Johny', 'Paris')
Vsetko funguje ale v chrome devtools nezistim co je zac, lebo je anonymny:
johny.introduce()
// I am Johny
johny.travel('Berlin')
// I have arrived at Berlin
johny
// Object {name: "Johny", place: "Berlin"}
// vidim len ze je Object
V podstate mam dve moznosti ako ho odanonymnit.
Prva je pridat property co nieco o nom prezradi:
function hikerFactory(name, place) {
let state = {name, place, type:'Hiker'}
...
johny
// Object {name: "Johny", place: "Berlin", type: "Hiker"}
// vidim ze je typu Hiker a teda ho zrejme vytvoril hikerFactory
Druha elegantnejsia je pomoct si triedou
class Hiker {
constructor(name, place) {
Object.assign(this, {name, place})
}
}
function hikerFactory(name, place) {
let state = new Hiker(name, place)
...
johny
// Hiker {name: "Johny", place: "Berlin"}
// vidim ze je z triedy Hiker a teda ho zrejme vytvoril hikerFactory
Otazka teda je: Co je zdravsie? Pridat si property na jeho identifikaciu alebo vytvorit jeho state z triedy ?