'конструктор' не делает то, что выглядит, как он. Это, в дополнение к его нестандартности, является хорошим поводом избегать его использования - придерживайтесь instanceof и prototype.
Технически: 'constructor' не является свойством экземпляра 's', это свойство объекта-прототипа 'Sub', показывающего сквозь. Когда вы создаете функцию «Sub» в Mozilla, вы получаете недавно созданный по умолчанию объект Sub.prototype, у которого есть «конструктор», указывающий на функцию Sub в качестве любезности.
Однако затем вы заменяете этот прототип новым Base (). Исходный прототип по умолчанию со ссылкой на Sub потерян; вместо этого Sub.prototype является экземпляром Base без какого-либо переопределенного свойства 'constructor'. Итак:
new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base
... вплоть до самого базового объекта, прототип которого вы не изменили.
Это обычно / лучше делать?
При работе с объектами / классами JavaScript не существует единого соглашения; Система метаклассов каждой библиотеки ведет себя немного по-разному. Я не видел ни одного, который записывал бы «конструктор» в каждый производный класс вручную, но это кажется таким же хорошим решением, как и любое, если вы действительно хотите, чтобы настоящий конструктор был доступен; это также сделает код совместимым с браузерами / движками, которые не дают вам конструктор.
Однако я бы подумал дать ему другое имя, чтобы избежать путаницы с существующим и по-другому поведением свойством конструктора.