Von Prototypische Vererbung in JavaScript
Ich benutze diesen Code seit einiger Zeit, um neue Objekte zu erstellen, die von früheren Objekten stammen. Ich bin jedoch über eine kleine Überraschung gestolpert.
%Vor% Beim Versuch, c.foo
zu ändern, änderte ich stattdessen a.foo
, c.foo
zeigt die Änderung an, weil sie von a
erbt. Die einzige Lösung, die ich gerade sehe, ist, nur die direkten Eigenschaften von b
zu ändern:
Ich bin mir sicher, dass es eine bessere Lösung gibt, die ich vermisse! Wie kann ich neue Objekte aus alten Objekten erstellen, ohne das Original zu verändern?
+1 für die Referenzierung von Crockford = D
Ich denke, Arrays werden immer als Referenz übergeben, und das Array wird nie kopiert. Ich denke Array.slice würde es kopieren, aber das ist ein Randfall ...
Die create-Funktion wird hauptsächlich zum Kopieren von Funktionen und dergleichen verwendet. Ich benutze diese Methode nie, da ich einfach eine Konstruktorfunktion erstelle:
%Vor%Auf diese Weise erhalten Sie immer ein neues Array für jeden Anruf. Mach einfach b = new a (); Es funktioniert für mich ...
Ich versuche, Vererbung zu vermeiden, weil es immer Probleme gibt. Ich würde einfach den Konstruktor verwenden und ihm dann neue Variablen zuweisen (nicht den Prototyp). Mehrfachvererbung wird jedoch schwierig ...
Wenn Sie ein neues Objekt von einem Prototyp erstellen, wird kein Kopieren ausgeführt. Nicht einmal die Eigenschaft wird kopiert:
%Vor%Wenn Sie das tun
%Vor% Dann ändern Sie nicht die Eigenschaft in F.protoype
, Sie fügen eine neue Eigenschaft zu f
hinzu:
Dies gilt also für jeden Wert, den Sie einer Eigenschaft zuweisen. Wenn Sie einen Wert klonen wollen, müssen Sie dies explizit tun. Der einfachste Weg besteht darin, einfach eine neue Eigenschaft im Konstruktor zu setzen:
%Vor%Dieses Problem tritt nur auf, wenn der Prototyp veränderbare Werte enthält, andere Werte können nicht geändert werden (die Eigenschaften können stattdessen Werte ändern).
Und wenn Sie F "ableiten" wollen, denken Sie daran, es vom neuen Konstruktor aus aufzurufen:
%Vor%Nun ja:
1)
%Vor%Ersetzen Sie Ihre F. Prototype-Referenz von a durch "test", so dass Sie keinen Fehler sehen, aber das ist tatsächlich schlimmer als 2)
2)
%Vor%ändert das Objekt seit c.foo [0] & amp; a.foo zeigen darauf (sie sind Referenzen / Zeiger auf den a-Wert)
Lösung hier
Dies ist die Lösung:
%Vor%Allgemeine Einschränkung dieser Lösung ist, dass Prototypen keine rekursiven Referenzen haben sollten.
Es ist auch möglich, dieses Problem ohne diese Einschränkung zu lösen, aber die Lösung wäre komplizierter. Um die Erstellung von unendlichen rekursiven Objekten zu verhindern, können Sie während des Initialisierungsprozesses eine Art temporären Map-Speicher verwenden. Dieser Speicher wäre Cache-Referenzen zwischen initialisierten Objekten.
Tags und Links javascript inheritance prototypal-inheritance