2013-09-25 4 views
2

У меня вопрос о наследовании объектов с Object.create.Наследовать от 2 объектов

У меня есть два объекта, которые должны вести себя как интерфейсы. Object3D и Light. Object3D представляет реальный объект в 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. Другой - PointLight. PointLightLight, но у него есть позиция, потому что она не светится повсюду. Он имеет некоторый диапазон. Поэтому он должен наследовать также от 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; 
})(); 
+0

Я не думаю, что JavaScript может выполнять множественное наследование. –

+0

Хорошо, мой пример делает смысл? Я уверен, что могу сделать это по-другому, но Im доволен этим ... –

+0

Это имеет смысл, но я мало знаю о наследовании в JavaScript. –

ответ

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.

Смежные вопросы