Bo w chwili, gdy change() jest wywoływane jako event listener, to jego this jest zmienione (na element, na którym doszło do zdarzenia).
Są dwa rozwiązania:
- arrow function,
- Function.prototype.bind().
Arrow function pozwala na zachowanie kontekstu this, więc wystarczy otoczyć event listener w taką funkcję:
element.addEventListener( 'click', ( event ) => {
this.change( event );
} );
Z kolei bind() pozwala stworzyć kopię danej funkcji, która ma na stałe przypisany konkretny kontekst, stąd też można to wykorzystać:
element.addEventListener( 'click', this.change.bind( this ) );
Pierwsze rozwiązanie jest IMO ciut ładniejsze + nie tworzymy dodatkowej kopii metody change().