Сначала короткий ответ: то, что вы делаете, - это (почти) лучшее, что вы можете сделать. Для небольшого улучшения вы можете заменить цикл for на Object.assign, и это сократит его на строку, но это все равно будет делать то же самое.
Теперь длинный ответ.
Я начну с того, что согласен со многими комментариями, которые пахнет этот дизайн (как в запахе кода). Скорее всего, не должно быть наследования, и каждый тип должен быть с использованием экземпляров других. Клиенты должны использовать объекты данных. Контейнеры должны быть массивом клиентских объектов. И пр.
С этим отказом от ответственности, вот более прямой ответ на ваш вопрос.
Имя того, что вы ищете, - множественное наследование / миксины. Python, просто для краткого примера, изначально поддерживает множественное наследование, поэтому в Python вы сможете написать:
class Client(Data, ContainerClient):
...
Но цепочка прототипов JavaScript поддерживает только одно наследование, поэтому вам придется согласиться на какой-то обходной путь. Один из таких обходных путей создает подклассы на лету с переменной base . Что-то вроде:
const ClientMixin = Sup => class extends Sup {
// ...
};
const ContainerMixin = Sup => class extends Sup {
// ...
};
Тогда вы можете определить ваши конкретные классы следующим образом:
class Container extends ContainerMixin(Data) {
// ...
}
class ContainerClient extends ClientMixin(ContainerMixin(Data)) {
// ...
}
Кажется ли, что это проще, чем то, что вы уже делали, решать вам. Конечно, другой обходной путь - просто скопировать свойства из одного класса в другой, как вы это делали.