function firstListItemMixinWithCodeDuplication() {
// - duplication of both, slot and implementation/code.
this.first = () => this[0];
}
function last() {
// implement code once ...
return this[this.length - 1];
}
function lastListItemMixinWithSharedReference() {
// ... then reuse via reference ...
// - duplicated slot but shared implementation/code.
this.last = last;
}
const list_A_1 = ["A", "B", "C"];
const list_A_2 = [2, 3, 4, 5, 6];
const list_B_1 = ["D", "C", "B"];
const list_B_2 = [6, 5, 4, 3, 2];
firstListItemMixinWithCodeDuplication.call(list_A_1);
firstListItemMixinWithCodeDuplication.call(list_A_2);
lastListItemMixinWithSharedReference.call(list_B_1);
lastListItemMixinWithSharedReference.call(list_B_2);
console.log('list_A_1.first() :', list_A_1.first());
console.log('list_A_2.first() :', list_A_2.first());
console.log('list_B_1.last() :', list_B_1.last());
console.log('list_B_2.last() :', list_B_2.last());
console.log('\n');
console.log('list_A_1.first :', list_A_1.first);
console.log('list_A_2.first :', list_A_2.first);
console.log(
'(list_A_1.first === list_A_2.first) ?',
(list_A_1.first === list_A_2.first),
'...applying closed code'
);
console.log('\n');
console.log('list_B_1.last :', list_B_1.last);
console.log('list_B_2.last :', list_B_2.last);
console.log(
'(list_B_1.last === list_B_2.last) ?',
(list_B_1.last === list_B_2.last),
'...applying shared code'
);
console.log('\n');
console.log(
'Object.getOwnPropertyNames(list_A_1) :',
Object.getOwnPropertyNames(list_A_1)
);/*
...
...
console.log(
'Object.getOwnPropertyNames(list_B_2) :',
Object.getOwnPropertyNames(list_B_2)
);*/
.as-console-wrapper { min-height: 100%!important; top: 0; }