Ich habe Mühe, den Unterschied der folgenden zwei Code-Sätze zu verstehen. Der ursprüngliche Code stammt von dem berühmten Ninja-Tutorial und ich habe ein bisschen für mich selbst vereinfacht.
Frage: Ich denke, ich verstehe, wie CodeA funktioniert. Ninja.prototype.swung = false
weist eine neue Eigenschaft in function Ninja()
zu, und ninjiaA.swung
wird deshalb als false ausgewertet. Wenn wir in CodeB jedoch zu Beginn die function Ninja()
mit this.swung = true
deklarieren, wird die spätere Zuweisung von Ninja.prototype.swung = false
nicht wirksam, und ninjaA.swung
bleibt als wahr zu bewerten. Ich verstehe nicht, warum diese spätere Aufgabe in CodeB nicht funktioniert. Könnte mich bitte jemand aufklären?
CodeA:
%Vor%CodeB:
%Vor%Vielen Dank im Voraus.
Wenn Sie eine Eigenschaft mit this
innerhalb der Konstruktorfunktion deklarieren, wird sie an jedes Objekt dieses Konstruktors angehängt.
Wenn Sie eine Eigenschaft für den Prototyp dieser Konstruktorfunktion deklarieren, bleibt sie dort und alle Objekte dieses Konstruktors verweisen darauf. Wenn Sie eine Eigenschaft mit dem gleichen Namen im Objekt und in der Prototypkette haben, blendet die Objekteigenschaft die Eigenschaft auf dem Prototyp aus.
Denken Sie darüber nach, wie die Eigenschaft in der Prototypkette bewertet wird, was die Dinge klarer machen könnte.
CodeA:
%Vor%CodeB:
%Vor%In Code B kommt es nie zu der Eigenschaft auf dem Prototyp.
Wenn Sie Ninja
als Konstruktor aufrufen, weisen Sie true
auf swung
zu. Bevor der Konstruktor ausgeführt wird, sieht das Objekt wie folgt aus:
Nachdem der Konstruktor ausgeführt wurde:
%Vor% Wenn Sie nach der Eigenschaft swung
fragen, wird die Prototypkette auf jeder Ebene überprüft, um festzustellen, ob sie existiert. Wenn es nicht existiert, wird der Wert undefined
zurückgegeben.
Tags und Links javascript prototype