JavaScript: Eigenschaftszuweisung durch Prototyp

8

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.

    
c4il 28.07.2010, 00:05
quelle

3 Antworten

15

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.

    
Anurag 28.07.2010, 00:12
quelle
6

Wenn Sie Ninja als Konstruktor aufrufen, weisen Sie true auf swung zu. Bevor der Konstruktor ausgeführt wird, sieht das Objekt wie folgt aus:

%Vor%

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.

    
ChaosPandion 28.07.2010 00:08
quelle
3

In JavaScript wird die an den Prototyp angehängte Methode nur aufgerufen, wenn die Methode nicht zuerst in der Instanz gefunden wird.

    
Pierreten 28.07.2010 00:10
quelle

Tags und Links