2012-06-19 29 views
5

Quiero saber por qué el código three.js está estructurado de la siguiente manera:three.js patrón de herencia

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... 

Quiero saber por qué lo llaman el constructor base en el constructor actual y también para el prototipo?

En MDN que muestran un patrón de esta manera:

subType = function(){ 
    //new properties for subType 
} 

subType.prototype = new baseType(); 

no tienen la llamada al constructor base en el constructor subtipo, así que ¿por qué Three.js hacen esto?

+1

https://developer.mozilla.org/ es/JavaScript/Guide/Details_of_the_Object_Model – Esailija

+1

posible duplicado de [javascript inheritance] (http://stackoverflow.com/questions/931660/javascript-inheritance) – Esailija

Respuesta

7

Dado que cada THREE.Object3D instancia hereda de THREE.Object3D.prototype, mediante el establecimiento de THREE.Camera.prototype esta manera, cada THREE.Camera ejemplo también heredar de THREE.Object3D.prototype.

Si no lo hace, las instancias THREE.Camera no heredarán ninguna propiedad asignada a THREE.Object3D.prototype.

Por lo tanto, ambas partes son importantes:

  • Al establecer THREE.Camera.prototype apropiadamente, nuevas instancias heredarán de THREE.Object3D.prototype y estas propiedades son compartidas por todas las instancias.

  • Llamando a la función de constructor "principal" está inicializando cada instancia con datos específicos de instancia.


Dicho esto, establecer el prototipo como este no es el mejor enfoque. ¿Qué pasa si THREE.Object3D espera argumentos sin los cuales el constructor no funcionaría?

Un mejor enfoque es crear un objeto vacío que hereda de THREE.Object3D.prototype, ya que esto es todo lo que necesita:

THREE.Camera.prototype = Object.create(THREE.Object3D.prototype); 
THREE.Camera.prototype.constructor = THREE.Camera; 

Referencia:Object.create

+0

Acepto usar Object.create en su lugar! –

+0

Si desea que los métodos del prototipo Object3D estén disponibles para los objetos de la cámara, ¿no podría asignar Camera.prototype directamente a Object3D.prototype -> 'THREE.Camera.prototype = THREE.Object3D.prototype'? ¿Por qué la necesidad de crear una nueva copia? para que pueda agregar nuevos métodos sin realizar la copia original? – 0xor1

+0

@DannyR: Exactamente. Si hiciera 'THREE.Camera.prototype = THREE.Object3D.prototype', cualquier cambio que realice en' THREE.Camera.prototype' también afectará a 'THREE.Object3D.prototype'. Es por eso que quieres este nivel de indirección (como yo lo llamaría). En cuanto a su edición, este es el segundo punto en mi lista. No es necesario que llame al constructor padre si no lo desea, pero es razonable hacerlo. –