2012-04-08 9 views
2

Ich lese ein Buch über OOP Javascript und blieb auf einem der Beispiele stecken.Prototyp Verwirrung: Elternprototyp Eigenschaft von Kind Prototyp betroffen

In der ersten Version des Beispielcodes wird eine neue Instanz der Shape-Konstruktorfunktion erstellt, und die -Methode wird aufgerufen. Die -Methode gibt "Triangle" zurück, das die name-Eigenschaft des Triangle-Prototyps ist, obwohl "Shape" die name-Eigenschaft des Shape-Prototyps sein soll.

In der zweiten Version des Beispielcodes gibt die Methode "Shape" wie gewünscht zurück. Ich frage mich, wie die Änderungen in der zweiten Version des Codes einen Unterschied gemacht, weil es scheint, in beiden Versionen des Beispielcodes, der Triangle Prototyp hält einen Verweis auf den Shape Prototyp, so würde die Eigenschaft des Shape Prototyp noch aktualisiert "Triangle" wird wegen Triangle.prototype.name = "Triangle";

ersten Version: jsfiddle

zweiter Version: jsfiddle

Antwort

1

Im zweiten Beispiel, wenn Sie Triangle.prototype = new F(); dann eine neue Instanz von F function zugewiesen wird erstellt und es geerbt Prototyp Shape die alle Änderungen in Triangle.prototype bedeutet, dass in dieser Objektinstanz aber nicht in den F's constructor, weil ein Objekt reflektiert werden Instanz kann seinen Konstruktor nicht ändern, aber wenn Sie in constructor's prototype/Shape.prototype ändern, wird jedes Objekt, das von dieser Konstruktorfunktion erstellt wurde, ebenfalls berücksichtigt. Aber wenn Sie Triangle.prototype = F.prototype zugewiesen wurden, könnte es anders sein.

Ich habe einige Änderungen vorgenommen here. Ich hoffe, es wird dir helfen, zu verstehen, in der Konsole zu sehen.

0

im zweiten Beispiel Triangle.prototype eine neue Referenz bekommt - neue F(). Anders als im ersten Beispiel ist also Triangle.prototype eine andere Referenz als Shape.prototype.

+0

Wenn F() auf Shape.prototype- und Triangle.prototype-Referenzen F() verweist, verweist Triangle.prototype nicht auf Shape.prototype durch die transitive Eigenschaft? – user701510

+0

neue F() und F.prototyp ist anders. –