Вы так говорите, будто существует какое-то эталонное ООП, хранящееся в палате мер и весов в Париже. ООП -- это несколько принципов, которые можно трактовать по-разному (Алан Кей, ЕМНИП, сказал: "Я изобрел термин ООП, но я не имел ввиду C++"). В JS вообще классов не было до недавнего времени, да и сейчас это тонкий слой синтаксической сахарной пудры над прототипами.
Когда мы в JS обращаемся к свойству объекта, то движок сначала ищет это свойство в самом объекте. Если свойство не найдено, то идем в объект, который записан как прототип этого объекта, и ищем в нем. Повторяем этот шаг, пока не найдем свойство или не дойдем до Object.
Когда мы вызываем метод объекта через точку (типа b.bar()
), то он выполняется в контексте этого объекта b
. super.foo()
пропускает первый шаг в поиске свойства, берет метод сразу из прототипа прототипа и тоже выполняет его в контексте b
. А в контексте b
метод bar у нас переопределяет родительский метод, поэтому у нас получается бесконечная рекурсия, которая насильно обрывается движком.
Что должно быть в Java/C++ я вам не подскажу, к сожалению. Возможно, там будет поведение, которое вы ожидаете.