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)?
quelle
Object.create
wird es umgesetzt.Object.create
funktioniert nicht in IE8" - was nur ein nutzloser Kommentar ist, wenn Sie ihn für diesen Anwendungsfall in 2 Sekunden in jedem Browser implementieren können.Nachdem sich mein Verständnis etwas erweitert hat, möchte ich auf Esailijas Antwort mit einem konkreten Beispiel aufbauen :
Ein besonderes Problem besteht darin, dass ein Konstruktor instanzspezifische Eigenschaften festlegen kann. Wenn Sie also ein Prototypobjekt verwenden, das mit erstellt wurde
new
, können alle Ihre untergeordneten Instanzen eine einzige vom Konstruktor definierte instanzspezifische Eigenschaft des Prototyps gemeinsam nutzen.Angenommen,
Parent
Instanzen haben jeweils eine eindeutigeid
Eigenschaft als Erstellungszeit festgelegt:Dies führt dazu, dass alle
Child
Instanzen eine einzelne Prototyp-id
Eigenschaft gemeinsam nutzen, die von dem einzigennew Parent()
Objekt geerbt wurde, das als verwendet wirdChild.prototype
.Ein besserer Ansatz für diesen Fall besteht darin,
Object.create
den übergeordneten Konstruktor (falls erforderlich) im untergeordneten Konstruktor zu verwenden und direkt aufzurufen:quelle