Search code examples
javascriptmultiple-inheritancemixins

Constructor and class properties within javascript mixins


I am trying understand mixins in javascript and all the examples and articles i have read so far talk about adding methods and not properties.

I have found Alex Jover Morales' article really useful and i have slightly modified his example to include an additional mixin and constructors with new properties within the mixins here.

Is what i have done below an anti-pattern? Is there a problem with having a constructor and properties within a mixin? Is there a problem with calling super() within each mixin's contructor?

const PlayMixin = superclass => class extends superclass {

  constructor(args) {
    let { favouriteGame } = args        
    super(args);
    this.favouriteGame=favouriteGame;
  }

  play() {
    console.log(`${this.name} is playing ${this.favouriteGame}`);
  }
};


const FoodMixin = superclass => class extends superclass {

  constructor(args) {
    let { genericFood } = args        
    super(args);
    this.genericFood=genericFood;
  }

  eat() {
    console.log(`${this.name} is eating ${this.genericFood}`);
  }

  poop() {
    console.log("Going to 💩");
  }
};


class Animal {
  constructor(args) {
    let {name} = args
    this.name = name
  }
}

class Dog extends PlayMixin(FoodMixin(Animal)) {
  constructor(...args) {    
    super(...args)
}

  bark() {
    console.log("Woff woff!")
  }

  haveLunch() {
    this.eat();
    this.poop();
  }
}

const jack = new Dog({name:"Jack", genericFood:"lobster", 
favouriteGame:"chess"});
jack.haveLunch();
jack.play();
.as-console-wrapper { max-height: 100%!important; top: 0; }


Solution

  • Is what i have done below an anti-pattern?

    No, it is not.

    Is there a problem with having a constructor and properties within a mixin?

    No, as long as you call super(...) in a manner that it works for all mixed in classes.

    Is there a problem with calling super() within each mixin's contructor?

    No, super always points to the extended class, there isno problem in calling that constructor.