mixin inheritance

const { log } = console;

// -------------- Mixin Inheritance --------------

// ⭐ mixin's base object
const canSaySomething = {
    say(phrase) { log(phrase) }
};

// ⭐ inherits from `canSaySomething`
const canSayHi = {
    
    // -------------------------------------
    // ⭐ prototype chain: 
    // can use Object.setPrototypeOf() instead.
    __proto__: canSaySomething,
    // -------------------------------------
    
    // -------------------------------------
    // ⭐ super 
    //     === [[HomeObject]].[[Prototype]]
    //     === canSayHi.[[Prototype]]
    //     === canSaySomething
    // -------------------------------------
    sayHi() { super.say(`Hello ${this.name}!`) },
    sayBye() { super.say(`Bye ${this.name}!`) },
};

// User
class User {
    constructor(name) {
        this.name = name;
    }
}

// --------------- mix in --------------------------
// ⭐ copy all enumerable own members from mixin(s)
//    to `User.prototype` (NOT `User`).
//
//             ╭ ⭐️ target  ╮ ╭source─╮
Object.assign( User.prototype, canSayHi );

const dude = new User("Dude");

dude.sayHi();          // Hello Dude!
dude.sayBye();         // Bye Dude!

Last updated