2016-07-01 8 views
0

Ich habe ein Javascript-Buch gelesen, das erst vor kurzem begonnen hat, einzuführen. Ich habe auch einige andere stackoverflow Fragen auf .prototype und __proto__ betrachtet und sie alle haben einige Beispiele, die ein bisschen zu weit fortgeschritten für mich sind, und ich habe Probleme, sie zu verstehen. Jetzt erklärt das Buch dies auf eine sehr verwirrende Art und Weise, also dachte ich, ich würde hier nach dem Grundverständnis fragen. Heres etwas Code, den ich gerade gemacht habeeinfache Verwendung von .prototype, was passiert hinter den Kulissen?

function Person(firstname,lastname){ 
    this.firstname = firstname; 
    this.lastname = lastname; 
} 

Person.prototype.getFullName = function(){ 
    return this.firstname + " " + this.lastname; 
} 
var john = new Person('John','Doe'); 
console.log(john); 

Jetzt heres, wo meine Verwirrung entsteht. Zu meinem Verständnis hinter den Kulissen hat jeder function eine , aber bis wir das Schlüsselwort von new verwenden, kommt es nicht wirklich ins Spiel.

Zu dem, was ich von meinem Buch verstehen oder ableiten kann, ist, dass .prototype hier uns erlaubt, eine Methode zur Person Funktion hinzuzufügen.

Kühl. Wenn ich also console.log(john.getFullName()); mache, erhalten wir John Doe. Nett! Genau wie vermutet. Aber wie kommt es, wenn ich mache console.log(john) zeigt es auf die Person Funktion und zeigt firstname: 'John' und lastname: Doe.

Was ist mit der Methode passiert, die wir gerade mit Person.prototype.getFullName hinzugefügt haben? Warum wird das nicht angezeigt, wenn wir John loggen?

+0

Wie ich es verstehe, fügt Ihr Code die Funktion dem Prototyp von Person hinzu. Wenn Sie stattdessen 'console.log (this.prototype)' verwenden, sollte es funktionieren. Oder eine nicht definierte Ausnahme auslösen. –

+0

Also, wenn ich einen anderen Benutzer erstelle, var john2 = new Person ('John2', 'Doe') ;. Gibt es einen Weg, so dass ich alles außer GetFullName erben kann? Seit Wenn ich console.log (john2) erhalte er den getFullName, den ich gerade zum Proto hinzufügte? –

+0

@cresjoy, es gibt keine Möglichkeit, es teilweise zu erben. Wenn du 'john2 = new Person (' ... ')' machst, erbt es alles in 'Person.prototype': nicht mehr und nicht weniger. Wenn du 'getFullName' überschreiben willst, kannst du 'john2.getFullName = function() {.. mach etwas anderes ..}' machen. Dies funktioniert so, wie es zuerst in John2 aussehen wird, bevor Sie Person.prototype ausprobieren. Obwohl, wenn Sie dies tun, sollten Sie in gerade eine neue Klasse/Funktion erstellen, die Person –

Antwort

1

Es wird angezeigt, wenn Sie das Dropdown-Menü __proto__ in der Konsole erweitern. Da Sie dem Prototyp die Funktion hinzugefügt haben, wird er angezeigt.

Function in prototype

+0

Oh, ich verstehe. Ich kann nicht glauben, dass ich das nicht gesehen habe. –

0

Objekte in Javascript Arbeit von ‚prototypische Vererbung‘, wo jedes Objekt regelmäßig Eigenschaften hat firstname, lastname sondern auch zu einem regelmäßigen Objekt verknüpft verwendet als ‚Prototyp‘ (Angabe in der __proto__ Eigenschaft). Der Verbindungsvorgang erfolgt automatisch, wenn Sie var john = new Person(...) tun: durch Person.prototype Angabe, weiß er, dass, wenn Sie eine Instanz von Person zu machen, sollte es zu Person.prototype

verknüpft werden Wenn Sie console.log(john), es wird nur die Eigenschaften zeigen direkt in die John Objekt.

Aber, wenn Sie john.getFullName(), Javascript Erbe Modell zu tun weiß, dass, wenn es nicht getFullName im john Objekt findet, dass es für sie rekursiv in __proto__ aussehen wird, bis er es findet. So wird es die getFullName Funktion in Person.prototype verwenden, weil es mit diesem Objekt verknüpft wurde, wenn john erstellt wurde.

0

Prototypen werden für die Vererbung in Javascript verwendet. Stellen Sie es sich so vor: Jedes Objekt (außer einem) hat einen Prototyp. dasjenige, das nicht ist, steht an der Spitze der Kette und ist das Ende der Vererbungshierarchie. Jedes Objekt in dieser Kette erhält alle Funktionen und Eigenschaften desjenigen darüber. Dies geschieht durch die Prototypen. Wenn Sie eine Funktion oder eine andere Variable zu einem Objektprototyp hinzufügen, so wie ich es verstehe, erhält jede Instanz dieses Objekts eine eigene Kopie davon. Die Sache mit Java-Skript ist, dass es 6 verschiedene Möglichkeiten gibt, um ein Objekt zu erstellen - das neue Schlüsselwort ist vollständig syntaktischer Zucker - und jeder erstellt ein Objekt. Dein Buch sollte irgendwann einmal gesagt haben, dass sogar Funktionen Objekte sind.

Javascript ist nicht so verwirrend. Es ist einfach kraftvoll und anders gestaltet.Es ist ein Wochen-Referenzsystem, das es robust, aber auch fehleranfällig aufgrund von Programmierfehlern macht.

Verwandte Themen