Mixins
[ misturas? ]

O que é?
É uma classe que define um conjunto de funções relacionadas a um tipo.
Ou seja, uma forma de composição de objetos, onde as características dos componentes se misturam em um objeto composto, de modo que as propriedades de cada mistura se tornem propriedades do objeto composto.
Analogia
Em vez de ter um monte de sabores de sorvete em diferentes compartimentos pré-misturados, você tem sorvete de baunilha e um monte de ingredientes separados que podem ser misturados para criar sabores personalizados para cada cliente.
Mixins clássicos
Eles podem ser vistos como objetos com atributos e métodos que podem ser facilmente compartilhados em vários outros protótipos de objetos.

Podemos estender facilmente o protótipo das funções acima para incluir comportamentos usando uma biblioteca auxiliar: underscore.js :

Vantagens
- a composição de objetos.
- resolve uma série de problemas da herança e classes em JavaScript.
- facilidade com a sintaxe.
- reutilização do código sem depender da herança.
Desvantagens
- exigem funções auxiliares ou bibliotecas.
- uma composição grande e mal feita pode ser complexa de se analisar.
Por baixo dos panos
cocktail, traits.js, jquery, underscore.js e muitas outras bibliotecas tem uma implementação derivada dessa função:

E geralmente é chamado para um protótipo:

Ou seja, agora MyClass tem todas as propriedades definidas em MyMixin.
Isso é ruim? Porque?
- os protótipos são modificados no local.
- super não funciona.
- a composição é comprometida.
Mixins funcionais
Mixins funcionais são funções que misturam novas propriedades ou comportamentos com propriedades de um determinado objeto. Passe qualquer objeto arbitrário em um mixin e ele será estendido.
Um mixin deve ser um processo, não um objeto.
Mixin funcional não significa programação funcional.
O método Object.assign() é usado para copiar os valores de todas as propriedades próprias enumeráveis de um ou mais objetos de origem para um objeto destino. Este método irá retornar o objeto destino.

Não há herança, mas um método simples de cópia. Ou seja, User pode ampliar outra classe e também incluir o mixin para “misturar” os métodos adicionais.

Vantagens
- são adicionadas à cadeia do protótipo.
- são aplicados sem modificar objetos existentes.
- super e instanceof funcionam.
- mixins podem ampliar outros mixins.
- não precisam de suporte a bibliotecas.
- não dependem de um construtor.
- encapsulamento de dados
Desvantagens
- baixo acoplamento.
- hierarquia inflexível.
- duplicação por necessidade.
- problema do gorila -> banana -> selva.
Conclusão
É uma classe que contém métodos para outras classes.
Outros idiomas, como python, permitem criar mixins usando herança múltipla. O JavaScript não suporta múltiplas heranças, mas os mixins podem ser implementadas copiando-as para o protótipo.
Podemos usar mixins como uma forma de aumentar uma classe por múltiplos comportamentos, como o manuseio de eventos.
Mixins podem se tornar um ponto de conflito se ocasionalmente substituir métodos de classe nativa. De modo geral, deve-se pensar bem sobre a nomeação de um mixin, para minimizar tal possibilidade.
