Kurzer Hintergrund: In JavaScript hat die Konstruktorfunktion für jeden Objekttyp eine prototype
Eigenschaft. Das prototype
bezieht sich auf ein Objekt, das jedes konstruierte Objekt als nächsten Schritt in seiner Prototypenkette verwendet. Wenn ein Typ einem anderen Typ inhärent sein soll, können Sie prototype
den untergeordneten Typ auf eine neue Instanz des übergeordneten Typs setzen.
Zum Beispiel:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
Meine Frage fragt, welcher Code an der Stelle " Some prototype object goes here
" im obigen Code stehen soll. Mein erster Instinkt ist, eine Instanz des übergeordneten Elements (dh new Parent()
) zu erstellen, aber in einem Kommentar zu einer Antwort auf Ist dies eine sichere Möglichkeit, einen Objektprototyp auf einen anderen zu kopieren? schreibt ein Benutzer:
Nein, nicht
new bar()
für das Prototypobjekt verwenden!
(... das ist eine Meinung, die ich in vielen SO-Antworten und Kommentaren gesehen habe, aber dies ist das einzige Beispiel, das ich derzeit zur Hand habe.)
Die andere Option ist die Verwendung Object.create(Parent.prototype)
als Child.prototype
. Soweit ich weiß, wird dadurch auch eine neue Parent
Instanz erstellt, der Parent
Konstruktor wird jedoch nicht ausgeführt .
Kann jemand erklären, warum das Ausführen der Konstruktorfunktion vermieden werden sollte, wenn ein Prototypobjekt aus einem übergeordneten Typ generiert wird? Gibt es ein erhebliches technisches Problem (möglicherweise bei mehreren Vererbungsebenen)? Oder ist ein solches Muster ein Missbrauch von Konstruktoren, der mit einigen prototypischen Best Practices kollidiert (z. B. wenn das Ausführen des Konstruktors beim Erstellen eines Prototyps gegen eine gewisse Trennung von Bedenken verstößt)?
Object.create
wird es umgesetzt.