В руби и PHP, классы самостоятельны и не имеют какого-то общего верховного суперкласса, как в JS. По-видимому лишь Object может выделять память, оттого и нужно вызывать super(), прежде чем можно будет модифицировать объект.
Насчет того, что так можно делать в чистом JS:
В чистом JS, конструктор уже сам по себе объект (т.к. функция <- Object и т д , оттого там и доступен this, указывающий на контекст).
В случае с классом, возможно намеренно запретили использование this (обнулили контекст или просто там какие-то подобия assert'ов) до того, как создастся объект, чтобы больше походить на "реальный" класс.
А дальше все, как говорил выше - лишь Object может определять объект.
Но я еще не читал как там у них в действительности у них устроено. Описал, по аналогии с другими ЯП, имеющими глобальный суперкласс.
Почитал:
По-видимому так и есть. Классы, в отличие от функций и переменных, нельзя использовать до объявления + классы объявляются с включенным 'strict mode' + 'constructor' выделен как особая функция, что предполагает добавление дополнительных требований при вычислении.
Так что не удивительно.
Вобще обычно не кидают в конструктор явной инициализации переменных, а оставляют лишь набор вызовов методов, что повышает понимание логики инициализации.
Потому тут 2 выхода:
1. Использовать метод начальной инициализации и переписать его так, чтобы инициализировал все переменные.
2. В дочернем классе, если необходимо, в переопределенном методе вызывать вспомогательный, нужный только для сабкласса, метод, который при необходимости, проинициализирует и подготовит нужные для переопределяемого метода, переменные.
Все чисто и надежно.