2

Object.create によるオブジェクトの継承について質問があります。

インターフェイスのように動作する必要がある 2 つのオブジェクトがあります。Object3DLightObject3D3D 空間で実際のオブジェクトを表示します。空間内の位置があり、たとえばこの位置を変更する機能が必要です。Light光るものすべてです。そして、すべての光にはそれぞれの色があります。

// I have resons to use iif, dont bother with that ;) 

var Object3D = (function() {

    var Object3D = function() {
        this.position = vec3.create();
    };

    return Object3D;
})();


var Light = (function() {

    var Light = function() {
        this.color = new Array(4);
    };

    return Light;
})();

ここで、「クラス」となる 2 つの別のオブジェクトが必要です。一つ目はAmbientLightAmbientLightどこでも光るだけなので、位置はありません。したがって、 から継承しLightます。もう一つはPointLight. PointLightですがLight、どこでも光るわけではないので、位置もあります。ある程度の範囲があります。したがって、 からも継承する必要がありObject3Dます。どうすればいいですか?Object.create からの結果をマージできますか?

var AmbientLight = (function() {

    var AmbientLight = function() {
        Light.call(this);
    };

    AmbientLight.prototype = Object.create(Light.prototype);

    return AmbientLight;
})();


var PointLight = (function() {

    var PointLight = function() {
        Light.call(this);
        Object3D.call(this);
        this.range = 10.0;
    };

    // this isnt correct
    // how to make it correct? 
    PointLight.prototype = Object.create(Light.prototype);
    PointLight.prototype = Object.create(Object3D.prototype); 

    return PointLight;
})();
4

1 に答える 1

0

あなたはまさに正しい考えを持っています。プロトタイプを設定している場所で、2 つのオブジェクトをマージするだけです。

PointLight.prototype = Object.create(Light.prototype);
var obj3D = Object.create(Object3D.prototype);

for (var key in obj3D) {
    if (obj3D.hasOwnProperty(key)) {
        PointLight.prototype.key = obj3D.key;
    }
}

もちろん、多重継承を処理するときに発生する通常の醜い問題はすべてあります。つまり、両方のオブジェクトに共通の名前を持つメンバーがある場合、Object3Dメンバーはメンバーを上書きしますLight

于 2013-09-25T15:50:06.857 に答える