2012-04-08 9 views
2

私はOOPのjavascriptに関する本を読んでいて、例の1つに固執しています。プロトタイプの混乱:親プロトタイププロパティが子プロトタイプの影響を受ける

サンプルコードの最初のバージョンでは、Shapeコンストラクタ関数の新しいインスタンスが作成され、toStringメソッドが呼び出されます。 toStringメソッドは、 "形状"がShapeプロトタイプのnameプロパティであると想定されていてもTriangleプロトタイプのnameプロパティである "Triangle"を返します。

サンプルコードの2番目のバージョンでは、toStringメソッドは意図したとおりに「図形」を返します。 プロトタイプのnameプロパティは、プロトタイプShapeのプロトタイプへの参照を保持するため、プロトタイプTriangleプロトタイプはサンプルコードの両方のバージョンのように見えるため、コードの2番目のバージョンの変更がどのように変化したのか疑問に思っていますjsfiddle

第二版:なぜならTriangle.prototype.name = "Triangle";

最初のバージョンの "トライアングル" に更新する - 新しいF()は、第2の実施例でjsfiddle

答えて

1

あなたがTriangle.prototype = new F();を割り当てるときに、第2の例では、F functionの新しいインスタンスが作成されていると、オブジェクトので、Triangle.prototypeの変更がそのオブジェクトインスタンスではなくF's constructorに反映されることを意味Shapeのプロトタイプを継承インスタンスはコンストラクタを変更できませんが、constructor's prototype/Shape.prototypeで変更すると、そのコンストラクタ関数によって作成されたオブジェクトも反映されます。しかし、Triangle.prototype = F.prototypeが割り当てられていれば、それは異なる可能性があります。

私はいくつかの変更を加えましたhere。コンソールで理解できるようになることを願っています。

0

、Triangle.prototypeは新しい参照を取得します。したがって、最初の例とは異なり、Triangle.prototypeは実際はShape.prototypeとは異なる参照です。

+0

Shape.prototypeとTriangle.prototypeがF()を参照している場合、TransitiveプロパティでShape.prototypeを参照していませんか? – user701510

+0

新しいF()およびF.prototypeが異なる。 –

関連する問題