Внутри
longEar.eat:
this.__proto__.eat.call(this);
то же самое, что
rabbit.eat.call(longEar)
и когда вы тут используете
call - вы принудительно устанавливаете
this для
rabbit.eat равным
longEar.
Соответственно внутри
rabbit.eat:
this.__proto__.eat.call(this);
становится равноценным
longEar.__proto__.eat.call(longEar);
и следовательно
rabbit.eat.call(longEar);
Получаем цикл.