2

私はOOPjavascriptに関する本を読んでいて、例の1つで立ち往生しています。

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

サンプルコードの2番目のバージョンでは、toStringメソッドは意図したとおりに「Shape」を返します。Triangleサンプルコードの両方のバージョンで、プロトタイプはプロトタイプへの参照を保持しているため、ShapeプロトタイプのnameプロパティShapeは引き続き「Triangle」に更新されるため、コードの2番目のバージョンでの変更がどのように違いを生んだのか疑問に思います。" のためTriangle.prototype.name = "Triangle";

最初のバージョン:jsfiddle

2番目のバージョン:jsfiddle

4

2 に答える 2

1

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

ここにいくつかの変更を加えました。理解に役立つことを願っています。コンソールで確認してください。

于 2012-04-08T02:58:06.877 に答える
0

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

于 2012-04-08T01:41:17.113 に答える