Потому что для стрелочной функции this - это конкретно this контекста объявления оной, а для нормальной функции this зависит от условий вызова.
Можно конечно использовать стрелочные функции, но именно для вашего случая и придумали передачу объекта:
class MyClass {
constructor(x) {
this.x = x;
}
onKeyDown(event) {
console.log(this);
}
onKeyUp(event) {
console.log(this);
}
handleEvent(event) {
switch(event.type) {
case 'keydown':
return this.onKeyDown(event);
case 'keyup':
return this.onKeyUp(event);
// ...
}
}
start() {
document.addEventListener('keydown', this);
document.addEventListener('keyup', this);
}
}
window.addEventListener('load', function() {
let c = new MyClass(5);
c.start();
});