Я создаю концепцию семьи для продукта, члены которого бывают разных типов (accountHolder
, payingCustomer
, student
и т. Д.). Первоначально я построил их как подклассы FamilyMember
, но в итоге я получил некоторый повторяющийся код и в итоге столкнулся с серьезной проблемой: student
нашей платформы также может быть единственным payingCustomer
и accountHolder
.
Учитывая, что составление объекта широко рекламируется как хорошая идея в JS, я решил пойти по этому пути. Однако методы определенного типа объекта (например, accountHolder
) не могут получить доступ к свойствам экземпляра объекта, если свойство принадлежит другому типу объекта (например, student
).
Чтобы сделать это более объективным, я решил повторить поведение, используя следующий код:
const person = (props) => {
let state = {
name: props.name,
}
state.isOfAge = () => {
// state.isAdult is always undefined because
// isAdult doesn't exist in this object
return state.isAdult === true
}
return state
}
const adult = (props) => {
return {
isAdult: true,
}
}
const factory = (props) => {
return Object.assign({}, person(props), adult(props))
}
const john = factory({
name: 'John',
})
console.clear()
console.log(john) // { isAdult: true, name: "John", isOfAge... }
console.log(john.isOfAge()) // false
Я ожидал, что john
метод isOfAge
сможет получить доступ к свойству isAdult
, поскольку он находится в объекте. Однако, концептуально я понимаю, почему это не работает: isOfAge
- это метод state
, а не полученный adult
экземпляр.
Если бы я использовал классы или даже традиционный механизм прототипа / конструктора, я знал, как заставить его работать (например, подключаться к prototype
). С составлением объектов я не знаю, как туда добраться, вероятно, из-за отсутствия опыта работы с FP.
Спасибо за помощь!