Я впервые использую композицию вместо наследования, я предпочитаю это, но у меня есть одна проблема - как вы создаете объекты, для которых вы хотите сочетание открытых и закрытых свойств.
Например, предположим, что вы хотите создать объект работоспособности, у которого есть метод setHealth (значение), который вы хотите сделать общедоступным, но вы также хотите, чтобы в этом объекте был закрытый метод flagDeath (), к которому нет доступа вне объекта, к которому создается. Работа, которую я сейчас использую, состоит в том, чтобы составлять объекты как к состоянию (частному), так и к базовому (общедоступному) объекту, объект состояния является закрытым с помощью замыканий, а базовый - нет, я продемонстрировал это ниже:
const createPlatform = (startX, startY, width, height, img) => {
frameList.push(this);
let state = { // Private properties
width,
height,
img,
pos: new Coords(startX, startY),
}
Object.assign(state, canDraw(state, 1), canCollide(state)); // Assign private functionality
let base = { // Public properties
frameDo: function () {
state.draw()
}
}
return Object.assign(base); // Assign public functionality
};