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?
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. –
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? –
@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 –