Ich bin auf meiner Reise, um objektorientierte Programmierung in Javascript zu lernen. Ich habe diese Video-Version von hier Ссылка , die ich ziemlich viel die prototypische Methode gegenüber der klassischen Methode verstanden habe.
Während ich die Lektion beobachtete, wurde ich durch das Beispiel unterbrochen, das für die klassische Methode gezeigt wurde, um mit Unterklassen zu arbeiten:
%Vor%Frage:
Nach meinem Verständnis von call
function wird this
auf den aktuellen Kontext gesetzt, der zum Beispiel aus dieser Zeile Answer.call(this,value)
von der Funktion FirmAnswer
stammt, also _val
von Answer
für FirmAnswer
und nicht für Answer
eingestellt werden (bitte korrigiere mich, wenn ich falsch liege).
Es führt mich also zu meiner Verwirrung, wenn die obige Analyse richtig ist, warum die get
Eigenschaft von FirmAnswer.prototype
Answer.prototype.get.call(this)
liefert und nicht nur Answer.prototype.get()
allein, da% code_de% bereits auf gesetzt ist this
beim Aufruf von FirmAnswer
?
Bitte schenkt mir etwas Licht, da ich momentan ziemlich verwirrt bin. Ich bin mir ziemlich sicher, dass ich die prototypische Methode gut verstehe, aber die klassische Methode verwirrt mich ziemlich.
Vielen Dank im Voraus!
Irrelevant, da zu Frage bearbeiten
Das ist seltsamer Code und enthält einen Fehler und etwas anderes, das unerklärlich ist.
Der Fehler ist diese Zeile:
%Vor% Dies ist offensichtlich Unsinn-Code, insbesondere, da FirmAnswer.prototype.get
auf etwas viel sinnvolleres zwei Zeilen später gesetzt wird. Ich bin mir ziemlich sicher, dass es so sein soll:
Das ist die normale Art der prototypischen Vererbung in Javascript vor dem ES6.
Beende die Irrelevanz
Ich verstehe nicht, warum FirmAnswer.prototype.get
auf eine andere Methode gesetzt wird, wenn der Aufruf in jedem Fall an Answer.prototype.get
delegiert wird, sobald der obige Fehler behoben ist.
Sie haben jedoch eine spezifische Frage gestellt: Warum ist diese Zeile notwendig?
%Vor% Warum können wir nicht einfach Answer.prototype.get()
machen? Wenn wir Answer.call(this,value);
angegeben haben, wurde der Kontext ( this
-Wert) nur für diesen Aufruf festgelegt. Es betrifft nur die Konstruktorfunktion. Wenn Sie Answer.prototype.get()
hätten, wäre der Kontext für den Funktionsaufruf tatsächlich Answer.prototype
, der keine _val
-Eigenschaft hat.
Dies ist jedoch alles irrelevant, da diese Methode nicht wirklich benötigt wird. Hier ist der Code in einer sinnvolleren Form:
Die Funktion FirmAnswers-Konstruktor übergibt dies an die Funktion Answer, wo Answer diese._val setzt. Wenn du also in der Konsole nach Glück suchen würdest FirmAnswer {_val: 7}
Es ist ein FirmAnswer-Objekt mit einem _val von 7
Wenn Sie FirmAnswer.prototype.get auf eine named anon-Funktion setzen, die einen Aufruf an Answer.prototype.get zurückgibt, übergeben Sie die FirmAnswers erneut an den Prototyp, der im Prinzip eine Kopie des Prototyps erstellt.
Nachdem Sie den Code bearbeitet haben, müssen Sie diesen nicht mehr haben:
%Vor%, weil FirmAnswer.prototype
bereits Funktion erhalten hat, wenn Sie dies tun:
kopiert die get-Funktion von Answer.prototype
nach FirmAnswer.prototype
Sie können es also löschen:
%Vor%Tags und Links javascript prototype-programming prototype-chain prototype-pattern