2

我有一个关于使用 Object.create 进行对象继承的问题。

我有两个对象,它们的行为应该像接口。Object3DLightObject3D在 3D 空间中呈现真实物体。它在空间中有它的位置,它应该有一些功能来改变这个位置。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;
})();

现在,我想要另外两个对象,它们将是“类”。第一个是AmbientLight. AmbientLight没有位置,因为它只是到处发光。所以它继承自Light. 另一种是PointLightPointLightLight,但它也有位置,因为它不会到处发光。它有一些范围。所以它也应该继承自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

你有完全正确的想法。只需在设置原型的地方将两个对象合并在一起:

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 回答