0

「WebGL-UpandRunning」という本では、非常に劇的な方法でカスタムジオメトリが構築されています。しかし、コードの最後から2行目は、眉をひそめました。コードは次のとおりです。

Saturn.Rings = function ( innerRadius, outerRadius, nSegments ) {

    THREE.Geometry.call( this );

    var outerRadius = outerRadius || 1,

    ...snip snip snip...


    this.computeCentroids();
    this.computeFaceNormals();

    this.boundinSphere = { radius: outerRadius };
};

Saturn.Rings.prototype = new THREE.Geometry();
Saturn.Rings.prototype.constructor = Saturn.Rings;

私の質問は、なぜ彼はプロトタイプチェーンでコンストラクターインスタンスを使用するのですか?Saturn.Rings.prototypeから継承する新しい空白のオブジェクトになれないのはなぜTHREE.Geometry.prototypeですか?継承する価値のあるすべてのものを配置するべきではありませんTHREE.Geometry.prototypeか?なぜ彼はプロトタイプをGeometry-constructorのインスタンスにするのですか?(新しいプロトタイプはのプロトタイプから継承するため、プロトタイプチェーンはまだ正しいことを認識していますTHREE.Geometry)。

また、上記のコードの2行目では、のインスタンスがコンストラクターSaturn.Ringsを通過しています。したがって、彼らは建設プロセスTHREE.Geometryから彼らが夢見ることができるすべてを手に入れます。THREE.Geometryしたがって、彼らのプロトタイプに同じことをする必要はありません。

同様のジオメトリがthree.js自体でどのように処理されるかを見てみましょう。

THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides ) {

    THREE.Geometry.call( this );

    ...snip snip snip...


    }

    this.computeCentroids();
    this.mergeVertices();

};

THREE.CubeGeometry.prototype = Object.create( THREE.Geometry.prototype );

きちんとした方法。唯一の問題は、プロトタイプの「コンストラクター」プロパティをに戻すように設定するのを忘れていることですがTHREE.CubeGeometry、それは別の問題です。

4

1 に答える 1

0

コンストラクターの呼び出しは、おそらく互換性のために行われます。 Object.create()JavaScript への比較的新しい追加であり、ECMAScript 5 の公開前にリリースされた一部のブラウザー (IE8 や IE7 など) ではサポートされていません。オブジェクトが他のオブジェクトのプロトタイプ ( demo )を継承するには、別のオブジェクトのコンストラクターを呼び出すだけでは不十分です。確かに、親オブジェクトのコンストラクターの呼び出しを回避することには利点がありますが、Object.create()「はるかに優れている」かどうかは議論の余地があります。

于 2012-10-10T23:38:17.037 に答える