'constructor' no hace lo que se ve como lo hace. Esto, además de su falta de uniformidad, es una buena razón para evitar usarlo: seguir con instanceof y prototipo.
Técnicamente: 'constructor' no es una propiedad de la instancia 's', es una propiedad del objeto prototipo 'Sub' que se ve a través de. Cuando creas la función 'Sub' en Mozilla, obtienes un objeto Sub.prototype por defecto recién creado que tiene un 'constructor' apuntando hacia atrás a la función Sub como cortesía.
Sin embargo, luego reemplaza ese prototipo con una nueva Base(). El prototipo original por defecto con el enlace de regreso a Sub se pierde; en su lugar, Sub.prototype es una instancia de Base sin ninguna propiedad ancestral de 'constructor'. Entonces:
new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base
... hasta el objeto más básico cuyo prototipo no se modificó.
¿Es convencional/mejor hacer esto?
Cuando se trata de objetos/clases de JavaScript no existe una convención; el sistema de metaclase de cada biblioteca se comporta de forma ligeramente diferente. No he visto uno que escriba 'constructor' para cada clase derivada manualmente, pero parece una solución tan buena como cualquiera si realmente quieres tener el constructor real disponible; también hará que el código sea compatible con navegadores/motores que no le dan 'constructor'.
Consideraría darle un nombre diferente, sin embargo, para evitar confusiones con la propiedad 'constructor' existente y de comportamiento diferente.
Acabo de ejecutar la comparación a través de una página html como alerta (s.constructor == Sub) y devolvió verdadero. –
Muchos marcos ajustan la propiedad 'constructor' apuntar correctamente al constructor de la subclase. Tengo una publicación que trata este y otros problemas en el código que mostraste arriba. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –