Herança múltipla com mixin
Em projetos reais, você frequentemente precisa compartilhar funcionalidades entre classes que não têm relação de herança — por exemplo, adicionar serialização JSON e validação a diferentes modelos. Mixins resolvem isso sem criar hierarquias rígidas: basta compor objetos de métodos. Aplicar esse padrão evita duplicação de código e mantém as classes focadas no seu propósito original.
O PROBLEMA
Crie mixins Serializable (toJSON, fromJSON) e Validatable (validar). Aplique em Usuario.
EXEMPLO
const u = new Usuario("Ana", "ana@ok.com");
u.toJSON() → '{"nome":"Ana","email":"ana@ok.com"}'
u.validar() → {valido:true}SOBRE O CONCEITO
Mixins são objetos com métodos que você “mistura” no protótipo de uma classe usando Object.assign. Por exemplo, Object.assign(Usuario.prototype, Serializable, Validatable). Isso adiciona toJSON, fromJSON e validar a todas as instâncias de Usuario. O erro comum é que, se dois mixins definirem um método com o mesmo nome, o último sobrescreve o anterior — por isso a ordem de Object.assign importa. Como extends é proibido, esse é o caminho para reuso horizontal. Dentro dos mixins, use this para acessar a instância, e lembre-se de que Object.assign copia propriedades enumeráveis, então defina os métodos como literais de objeto.
RESOLUÇÃO