Learning .prototype

8

Bearbeiten: Für diejenigen, die diesen Post in Zukunft sehen, diese Site war zweifellos kritisch für mich, um Javascript zu verdauen. Wenn Sie von einem traditionellen OOP-Hintergrund kommen, empfehle ich es sehr. Die UML-esq-Diagramme waren erstaunlich.

Ich kann immer noch nicht verstehen, was die Eigenschaft .prototype in Javascript ist. Ist es nur ein Verweis auf ein anderes Objekt? Oder ist es ein Verweis auf einen Zeiger auf ein anderes Objekt? Ich komme aus C / C ++ / x86 und kann einfach nicht sehen, wie es funktioniert. Schauen wir uns einige Beispiele an, wie ich die Dinge derzeit sehe; Es würde helfen, auf meine Fehler hinzuweisen, um zu sehen, wie die Dinge funktionieren. Ich weiß nicht einmal, ob einige davon gültige Syntax sind. Object und Function sind die globalen Objekt- bzw. Funktionsobjekte.

%Vor%

Ich bin so verwirrt.

%Vor%

Ich verstehe auch nicht, Prototypen herumzuwechseln.

%Vor%

Ich kann das Konzept nicht verstehen. Ich verstehe das nicht ganz. Ich verstehe nicht, wie geklonte Objekte ihre eigenen lokalen Kopien von Daten erhalten, aber Änderungen am ursprünglichen Objekt (der Prototyp) laufen irgendwie auf die Klone hinaus. Ich habe mit FigureBug herumgetüftelt und Dinge ausprobiert, aber geistig kann ich nicht auf eine Idee kommen, die mit jedem Beispiel übereinstimmt, das ich gesehen habe

C ++ mag eine riesige Monstrosität sein, aber zumindest weiß ich genau was los ist. Hier ... Ich benutze meine beste Schätzung .. Nur ein neues Paradigma, nehme ich an. Wie auch immer, danke, wenn Sie mir helfen können ... Ich bin auf diesen Prototyp gesprengt.

    
gone 15.07.2013, 17:23
quelle

2 Antworten

4

Wow, das sind viele Fragen. Lassen Sie uns durch sie arbeiten.

  

Ist es einfach eine Referenz auf ein anderes Objekt? Oder ist es ein Verweis auf einen Zeiger auf ein anderes Objekt?

In JavaScript gibt es keine Zeiger. Eine Variable oder Eigenschaft, die "ein Objekt" enthält, enthält jedoch tatsächlich eine Referenz auf das Objekt, so dass andere Variablen Referenzen auf dasselbe Objekt enthalten können.

%Vor%

Das globale Objekt ( window , wenn Sie möchten), wo alle globalen Variablen definiert sind, hat keinen Prototyp (Ausnahmen in einigen Umgebungen sind nicht wichtig).

  

Ich kann immer noch nicht verstehen, was die Eigenschaft .prototype in Javascript ist.

Die Eigenschaft .prototype ist eine Eigenschaft, die alle Funktionsobjekte haben und auf ihr Prototypobjekt (ein einfaches Objekt) zeigen.

Sie dürfen es nicht mit der internen Prototyp Referenz verwechseln, die jedes Objekt besitzt. Dieser Prototyp zeigt auf das Objekt, in dem Eigenschaften nachgeschlagen werden, die ein Objekt nicht selbst besitzt.

%Vor%

Dies ist das Objekt, von dem alle Function-Objekte erben. Es enthält Dinge wie call oder bind .

%Vor%

Ja, irgendwie. Ich denke, Sie haben das Konzept, aber nicht die Terminologie. Während func.prototype eine andere Sache ist, existiert die Eigenschaft obj.prototype gar nicht. Sie haben jedoch die internen Prototypen gemeint, auf die wir über die Funktion Object.getPrototypeOf zugreifen können. Und sie beziehen sich nicht auf die Konstruktorfunktionen, sondern auf ihre Prototypobjekte. Hier ist die Korrektur:

%Vor%
  

sollte es "neues Foo" oder "neues Foo ()" sein?

Das macht nichts, sie sind gleichwertig. Sie benötigen die Klammern nur dann explizit, wenn Sie Argumente übergeben möchten.

%Vor%

Auch hier waren Ihre Annahmen richtig, aber falsch ausgedrückt. Lassen Sie uns die Details durcharbeiten.

Oben habe ich über "Prototyp-Objekte" gesprochen. Was sind diese? Sie sind einfache Objekte, die implizit mit jeder Funktion erzeugt werden. In diesem Fall ist Foo.prototype - ein leeres Objekt. Wir behandeln hier also drei Objekte: Die% constructor-Funktion% co_de, ihr Foo -Prototyp-Objekt und die Foo.prototype -Instanz.

Was ist das Besondere an foo ? Es ist das erste, was der Operator foo tut. Wenn eine Funktion als Konstruktor aufgerufen wird - mit new -, wird auf ihre Eigenschaft new zugegriffen und ein neues Objekt wird mit seinem internen Prototyp für dieses Prototypobjekt instanziiert. Das ist das Wunderbare. Danach wird die Funktion für die neue Instanz aufgerufen, so dass .prototype das neue Objekt ist; In Ihrem Fall wird die Eigenschaft this für die Instanz erstellt. Dann wird das Ergebnis zurückgegeben (und .prop1 zugewiesen).

Wie kann man jetzt diese Magie nutzen? Der Punkt besteht darin, Eigenschaften für das Prototypobjekt zu erstellen, die dann übernommen werden.

%Vor%
  

Ich verstehe auch nicht, Prototypen herumzuwechseln.

Das Problem ist, dass dies ziemlich unmöglich ist. Einmal instanziiert, ist die Prototypkette eines Objekts ziemlich statisch. Das brauchst du aber nicht oft.

%Vor%

Das hat nicht funktioniert, weil die foo -Eigenschaft nicht das ist, was Sie erwartet haben.

%Vor%

Das funktioniert nur ein bisschen. Schauen Sie sich oben an, was .prototype macht - es sucht nur einmal nach der Eigenschaft new des Konstruktors. Der interne Prototyp bleibt dann gesperrt - Sie ändern die .prototype -Instanz nicht. Wenn Sie jedoch jetzt eine neue Instanz c erstellen würden, würde sie von der Instanz var d = new C() erben.

Ich hoffe, das hilft; Wenn Sie weitere Fragen haben, kommentieren Sie bitte.

    
Bergi 15.07.2013, 20:35
quelle
2

Der Prototyp wird verwendet, um Eigenschaften zu durchsuchen, wenn das Objekt selbst während des Lesevorgangs nicht definiert ist. Schreibvorgänge geschehen immer am Objekt selbst.

Wenn Sie

anrufen %Vor%

NB.

Instanziieren Sie die Elternklasse nicht, nur um die Vererbung einzurichten. Sehen Sie, warum hier Ссылка

    
Juan Mendes 15.07.2013 17:36
quelle

Tags und Links