Wie funktioniert das mit einer klassischen Methode des Prototyping in Javascript?

8

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!

    
Roljhon 26.01.2017, 21:10
quelle

3 Antworten

1

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:

%Vor%

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:

%Vor%
    
lonesomeday 26.01.2017, 21:39
quelle
0

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.

    
JellyKid 26.01.2017 21:41
quelle
0

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:

%Vor%

kopiert die get-Funktion von Answer.prototype nach FirmAnswer.prototype

Sie können es also löschen:

%Vor%     
tfidelis 26.01.2017 21:38
quelle