Миксины

Создадим два объектных литерала и укажем в них методы.

const canEat = {
    eat() {
        this.hunger--;
        console.log('eating');
    }
}

const canWalk = {
    walk() {
        console.log('walking');
    }
}

Теперь мы можем объеденить эти два объекта вместе, чтобы создать чувака, который может есть и ходить. В ES6 у нас есть новый метод Object.assign. Мы можем использовать его, чтобы скопировать свойства и методы из одного объекта в другие. Мы передаем пустой объект как цель, а затем передаем один, или несколько объектов-источников.

const person = Object.assign({}, canEat, canWalk);
console.log(person);

Теперь, даже если мы будем использовать функцию-конструктор, мы все равно всё еще можем использоавть эту технику. Давайте создадим такую функцию. И теперь, первым аргументом в Object.assign мы передадим не пустой объект, а Person.prototype.

function Person() {};
Object.assign(Person.prototype, canEat, canWalk);
const person = new Person();

Давайте представим, что завтра мы добавим еще два новых объекта в наше приложение. Goldfish и Duck. Они оба должны уметь плавать. Итак, мы определим новую фичу, константу — canSwim.

const canSwim = {
    swim() {
        console.log();
    }
}

И теперь определим новый конструктор — Goldfish. Воспользуемся методом Object.assign, чтобы изменить прототип рыбы. В этот раз мы замиксуем возможность есть и плавать.

function Goldfish(){};

Object.assign(Goldfish.prototype, canEat, canSwim);

const person = new Person();
const fish = new Goldfish();

console.log(person);
console.log(fish);

composition example
Как видите, композиция или миксин дают великолепную гибкость.

Чтобы логика была более читаема, мы можем вынести метод Object.assign в отдельную функцию, под названием mixin.