6

three.jsコードが次のように構成されている理由を知りたいです。

THREE.Camera = function(){
    THREE.Object3D.call(this);
    //add more Camera specific properties and methods
}

THREE.Camera.prototype = new THREE.Object3D();
THREE.Camera.prototype.constructor = THREE.Camera;

THREE.Camera.prototype.//add more camera specific methods...

彼らが現在のコンストラクターとプロトタイプのベースコンストラクターを呼び出す理由を知りたいですか?

MDNでは、次のようなパターンを示します。

subType = function(){
    //new properties for subType
}

subType.prototype = new baseType();

subTypeコンストラクターにベースコンストラクターへの呼び出しがないのに、なぜTHREE.jsがこれを行うのですか?

4

1 に答える 1

7

THREE.Object3Dインスタンスはから継承するため、このようにTHREE.Object3D.prototype設定すると、各インスタンスもから継承します。THREE.Camera.prototypeTHREE.CameraTHREE.Object3D.prototype

これを行わないと、THREE.Cameraインスタンスはに割り当てられたプロパティを継承しませんTHREE.Object3D.prototype

したがって、両方の部分が重要です。

  • 適切に設定することによりTHREE.Camera.prototype、新しいインスタンスはから継承されTHREE.Object3D.prototype、これらのプロパティはすべてのインスタンスで共有されます。

  • 「親」コンストラクター関数を呼び出すことにより、インスタンス固有のデータを使用して各インスタンスを初期化します。


とはいえ、このようにプロトタイプを設定することは最善のアプローチではありません。THREE.Object3Dコンストラクターが機能しない引数を期待する場合はどうなりますか?

より良いアプローチは、から継承する空のオブジェクトを作成するTHREE.Object3D.prototypeことです。これが必要なすべてだからです。

THREE.Camera.prototype = Object.create(THREE.Object3D.prototype);
THREE.Camera.prototype.constructor = THREE.Camera;

参照: Object.create

于 2012-06-19T12:59:10.183 に答える