2013-09-25 134 views
2

我有一個關於Object.create對象繼承的問題。從2個對象繼承

我有兩個對象,應該像接口一樣。 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; 
})(); 

現在,我想要另外兩個對象,這將是'類'。首先是AmbientLightAmbientLight沒有位置,因爲它只是發光無處不在。所以它從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; 
})(); 
+0

我不認爲JavaScript可以做多重繼承。 –

+0

那麼我的例子是做出來的?我敢肯定,我可以做的另一種方式,但我很高興有這樣的產品...... –

+0

這是有道理的,但我不知道很多關於在JavaScript中繼承。 [在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成員。