‚Konstruktor‘ nicht tut, was es sieht aus wie es funktioniert. Dies ist, zusätzlich zu seiner Nicht-Standardität, ein guter Grund, es zu vermeiden - bei Instanz und Prototyp zu bleiben.
Technisch: 'Konstruktor' ist keine Eigenschaft der 's' Instanz, es ist eine Eigenschaft des 'Sub' Prototyp-Objekts, die durchgeht. Wenn Sie die Funktion "Sub" in Mozilla erstellen, erhalten Sie ein neugebildetes Standard-Sub.prototype-Objekt, das einen 'Konstruktor' hat, der zurück auf die Sub-Funktion verweist.
Allerdings ersetzen Sie dann diesen Prototyp mit einem neuen Base(). Der ursprüngliche Standardprototyp mit der Verbindung zurück zu Sub ist verloren gegangen; Stattdessen ist Sub.prototype eine Instanz von Base ohne überschreibende Konstruktoreigenschaft. Also:
... bis hinunter zum grundlegendsten Objekt, dessen Prototyp Sie nicht geändert haben.
Ist es konventionell/besser, dies zu tun?
Beim Umgang mit JavaScript-Objekten/-Klassen gibt es keine Konvention; Das Metaklassensystem jeder Bibliothek verhält sich etwas anders. Ich habe keine gesehen, die 'Konstruktor' für jede abgeleitete Klasse manuell schreibt, aber es scheint so gut wie eine Lösung zu sein, wenn Sie wirklich den echten Konstruktor verfügbar haben wollen; Es macht den Code auch kompatibel mit Browsern/Engines, die Ihnen keinen Konstruktor geben.
Ich würde es jedoch in Betracht ziehen, einen anderen Namen zu vergeben, um eine Verwechslung mit der vorhandenen und andersartigen "Konstruktor" -Eigenschaft zu vermeiden. Ja
Ich habe gerade den Vergleich über eine HTML-Seite als Alert (s.constructor == Sub) und es zurückgegeben wahr –
Viele Frameworks anpassen die 'Konstruktor'-Eigenschaft zu Zeigen Sie auf den Konstruktor der Unterklasse. Ich habe einen Beitrag, der sich mit diesem und anderen Problemen in dem Code befasst, den Sie oben zeigten. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –