2012-06-19 91 views
5

我想知道爲什麼three.js所代碼的結構是這樣的: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(); 

他們不必調用在子類型構造函數的基類的構造,所以爲什麼three.js所做到這一點?

+1

https://developer.mozilla.org/ EN/JavaScript的/指南/ Details_of_the_Object_Model – Esailija

+1

的可能重複[Javascript繼承(http://stackoverflow.com/questions/931660/javascript-inheritance) – Esailija

回答

7

由於每個THREE.Object3D例如,從THREE.Object3D.prototype繼承,通過設置THREE.Camera.prototype這樣,每個THREE.Camera實例也將從THREE.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

+0

我同意使用的Object.create,而不是! –

+0

如果您希望Object3D原型的方法可用於Camera對象,那麼您是否可以直接將Camera.prototype直接賦值給Object3D.prototype - >'THREE.Camera.prototype = THREE.Object3D.prototype'?爲什麼需要創建一個新的副本呢?所以你可以添加新的方法,而不影響原始副本? – 0xor1

+0

@DannyR:沒錯。如果你要做'THREE.Camera.prototype = THREE.Object3D.prototype',那麼你對'THREE.Camera.prototype'所做的任何更改也會影響'THREE.Object3D.prototype'。這就是爲什麼你想要這一層間接性(正如我所說的那樣)。關於你的編輯,這是我列表中的第二點。如果你不想,你不必調用父構造函數,但這樣做是合理的。 –