Object.create vs direkte prototypische Vererbung

9

Ich habe mit Object.create in der EcmaScript 5-Spezifikation herumgespielt, und ich versuche, eine Mehrfachvererbungsstruktur zu erstellen.

Sagen wir, ich habe ein paar Funktionen: a, b und c. Wenn ich nur mit Prototypen arbeite, kann ich das tun:

%Vor%

Aber mit Object.create würde ich etwas tun:

%Vor%

Ich denke, ich bekomme das gleiche Ergebnis in beide Richtungen.

Das scheint irgendwie klobig zu sein, weil ich statt einer Konstruktorfunktion auf Objekt zurück komme. Es scheint mir, dass die reguläre prototypische Vererbung weniger aufdringlich ist und sinnvoller für modulare Anwendungen ist, die keine spezielle Behandlung benötigen.

Vermisse ich etwas? Gibt es einen Vorteil davon, Object.create mit Konstruktoren zu erstellen? Oder ist das nur zum Kopieren vorhandener Objekte sinnvoll? Ich möchte nur Zugriff auf Eigenschaften & amp; Funktionen, die an den Prototyp angehängt sind, und keine Funktionen und Eigenschaften, die später dem Objekt hinzugefügt werden.

Oder was ist damit (oder verwenden Sie eine bessere Deep-Copy, aber die Idee bleibt gleich)?

%Vor%     
tjameson 14.06.2011, 02:12
quelle

2 Antworten

4

Tatsächlich erhalten Sie nicht das gleiche Ergebnis in beide Richtungen. Betrachte diese Zeile:

%Vor%

Was dies tut, ist b.prototype auf genau die gleiche Objektreferenz wie a.prototype zu setzen. Wenn Sie das erste Objekt ändern (z. B. indem Sie eine fnB -Methode hinzufügen), ändern Sie auch das zweite Objekt. Sie sind das Gleiche. Am Ende Ihres ersten Code-Satzes haben Sie drei Prototypen, die alle exakt gleich sind und dieselben Methoden und Eigenschaften aufweisen.

Der springende Punkt bei der prototypischen Vererbung ist, dass Sie ein "interessantes" Objekt definieren (also mit dem von Ihnen gewünschten Verhalten) und es dann mit Object.create klonen und die Klone an Ihre Bedürfnisse anpassen (in der Regel durch Ändern von Eigenschaften, nicht seine Methoden).

Angenommen, Sie haben ein Addierobjekt:

%Vor%

Dann erstellen Sie einen Klon und legen seine Eigenschaften fest:

%Vor%

Nun ist das offensichtlich ein dummer Fall, aber es zeigt, dass man sich eine prototypische Vererbung vorstellen kann, ohne Konstruktoren und explizite Prototypen für diese Konstruktoren schreiben zu müssen.

    
jmbucknall 14.06.2011, 02:35
quelle
0

Wenn Sie Browser unterstützen müssen, die Object.create() nicht unterstützen, können Sie dies verwenden

%Vor%
  

Die Objektfunktion entwirrt das Konstruktormuster von JavaScript, wodurch eine echte prototypische Vererbung erreicht wird. Es nimmt ein altes Objekt als Parameter und gibt ein leeres neues Objekt zurück, das von dem alten Objekt erbt. Wenn wir versuchen, ein Mitglied von dem neuen Objekt zu erhalten, und es diesen Schlüssel fehlt, dann wird das alte Objekt das Mitglied liefern. Objekte erben von Objekten. Was könnte objektorientierter sein?

Weitere Informationen finden Sie hier: Prototypische Vererbung in JavaScript

    
Ivan V. 16.11.2013 19:37
quelle