According to various sources (2ality, esdiscuss) one should be able to add mixins to classes:
EDIT discovered that class methods are not enumerable so that cannot work. Edited the code below, but still no joy
class CartoonCharacter {
constructor(author) {
this.author = author;
}
drawnBy() {
console.log("drawn by", this.author);
}
}
// THIS CANNOT WORK
// class methods are not enumerable
// class Human {
// haveFun() {
// console.log("drinking beer");
// }
// }
let Human = Object.create({}, {
haveFun: {
enumerable: true,
value: function () {
console.log("drinking beer");
}
}
});
class Simpson extends Object.assign(CartoonCharacter, Human) {
constructor(author) {
super(author);
}
}
let homer = new Simpson("Matt Groening");
homer.drawnBy(); // expected: drawn by Matt Groening
homer.haveFun(); // expected: drinking beer
I get the "drawn by Matt Groening" but instead of the "drinking beer" I get an error
-> Uncaught TypeError: E.haveFun is not a function
There are two problems with your mixins:
Object.assign
only copies enumerable properties of an object. However, the methods and properties of a class are non-enumerable.This is how you would extend a class using mixins:
It works as expected in Babel: demo.