„konstruktor” nie robić to, co wygląda na to, że tak. To, oprócz nietypowości, jest dobrym powodem, aby go nie używać - trzymać się instancji i prototypu.
Technicznie: "konstruktor" nie jest właściwością instancji "s", jest własnością obiektu prototypowego "Sub". Kiedy utworzysz funkcję "Sub" w Mozilli, otrzymasz nowy, domyślny obiekt Sub.prototype, który ma "konstruktor", wskazując drogę do funkcji Sub jako grzeczność.
Jednak należy zastąpić ten prototyp nowym Base(). Oryginalny domyślny prototyp z łączem z powrotem do Sub zostaje utracony; zamiast tego Sub.prototype jest instancją Base bez żadnej nadpisującej właściwości 'constructor'. A więc:
new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base
... aż do najbardziej podstawowego obiektu, którego prototyp nie został zmieniony.
Czy to jest konwencjonalne/lepiej to zrobić?
W przypadku obiektów/klas JavaScript nie ma jednej konwencji; system metaklasy każdej biblioteki zachowuje się nieco inaczej. Nie widziałem takiego, który ręcznie zapisuje "konstruktor" do każdej klasy pochodnej, ale wydaje się równie dobrym rozwiązaniem, jeśli naprawdę chcesz mieć dostęp do prawdziwego konstruktora; spowoduje to również, że kod będzie zgodny z przeglądarkami/silnikami, które nie dają "konstruktora".
Zastanowiłbym się nad nadaniem mu innej nazwy, aby uniknąć nieporozumień z istniejącą i odmiennie zachowującą się właściwością "konstruktora".
Właśnie przeprowadziłem porównanie przez stronę html jako alert (s.constructor == Sub) i to zwróciło prawdę –
Wiele frameworks dostosowuje właściwość 'constructor' poprawnie wskaż konstruktor podklasy. Mam post, który zajmuje się tym i innymi problemami w kodzie, który pokazałeś powyżej http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –