const { log } = console;
// -------------- Object.assign --------------
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
// -------------- Mixins --------------
// โญ mixin (similar to Swift protocols)
let canSayHi = {
sayHi() { log(`Hello ${this.name}!`) },
sayBye() { log(`Bye ${this.name}!`) },
};
// User
class User {
constructor(name) {
this.name = name;
}
}
// -------------------------------------------------
// โญ copy all enumerable own members from mixin(s)
// to `User.prototype`, NOT `User` itself.
//
// โญ โญ๏ธ target โโฎ โญsourceโฎ
Object.assign( User.prototype, canSayHi );
//
// -------------------------------------------------
// now User can say hi
new User("Dude").sayHi(); // Hello Dude!
[
// same object
target, // { a: 1, b: 4, c: 5 }
returnedTarget, // { a: 1, b: 4, c: 5 }
target === returnedTarget, // true
// same function
User.prototype.sayHi === canSayHi.sayHi, // true
].forEach(x => log(x));