Nu är jag inte häller någon expert men kan visa ett exempel vad gällande exempelvis addEventListener.
Allt i Javascript är funktioner och objekts. cards använder sig av querySelectorAll som spottar ut en Array. Array har då en drös med prototyper, som är funktioner som finns tillgängliga, som exempelvis forEach som du använder. Det går till exempelvis inte att göra cards.toString() för den funktionen finns inte för Arrays. Medans om du hade gjort querySelector, så hade toString funkat men inte forEach.
Så vad du har gjort är att ha ropat på en annan function som heter addEventListener, som tar 2 parametrar, och beroende på de, så return'ar den ett objekt som du kan leka med.
Ett kodexempel så kanske det blir mer förståligt:
const element = document.querySelector('div');
element.__proto__.myCustomEvent = function(type, fn) {
let myEvent = {
enMassaOlikaSaker: 'obj, fn, stuff',
}
return fn(myEvent)
}
element.myCustomEvent('click', function(myEvent) {
console.log('myEvent:', myEvent) // { enMassaOlikaSaker: 'obj, fn, stuff' }
})