2011-10-16 21 views
35

estoy navegando por la discusión de un tema similar, pero no puedo encontrar mi situación ...Heredar argumentos de constructor padre

Intento llamar a los constructores de los padres con los parámetros ... parece que no puede hacer las cosas bien .

que tienen una superclase PhysicsBody que toma aNode como su único argumento del constructor:

function PhysicsBody(aNode) { 
    this.userData = aNode; 
    // ... 
} 

De esta PhysicsBody hereda una clase DynamicBody. Es constructor también toma aNode como único argumento ... Al igual que lo haría en Java, me gustaría llamar a algo equivalente a "super(aNode"); Parece que no puede encontrar cómo.

Aquí está la clase DynamicBody:

// Wanted to give "new PhysicsBody(this, aNode)", but that fails! 
DynamicBody.prototype = new PhysicsBody(); 
DynamicBody.prototype.constructor=DynamicBody; 

function DynamicBody(aNode) { 

    // calling the parent constructor fails too: 
    // PhysicsBody.prototype.constructor.call(this, aNode); 
    //... 
} 

Respuesta

58

Una forma de hacerlo:

function PhysicsBody(aNode) { 
    this.userData = aNode; 
} 

PhysicsBody.prototype.pbMethod = function() {}; 

function DynamicBody(aNode) { 
    PhysicsBody.call(this, aNode); 
} 

// setting up the inheritance 
DynamicBody.prototype = Object.create(PhysicsBody.prototype); 

DynamicBody.prototype.dbMethod = function() {}; 

Ahora, cuando lo hace

var pb = new PhysicsBody('...'); 

la instancia pb obtiene una propiedad userData y también hereda los métodos de PhysicsBody.prototype (pbMethod en este caso).


Al hacer

var db = new DynamicBody('...'); 

la instancia db obtiene una propiedad userData y también hereda los métodos de DynamicBody.prototype (dbMethod en este caso), que a su vez hereda de PhysicsBody.prototype.

+0

Excelente, gracias por su tiempo! – Jem

+0

¡Brillante! Esto me ha engañado desde la antigüedad, sin embargo, era tan simple .. * faceslap * –

+0

@ Lars-Erik Para ser sincero, es un desastre :-). La próxima edición de JavaScript (ECMAScript 6) traerá sintaxis de clase, lo que hará que este patrón sea mucho más simple. –

10

Si he entendido bien, diciendo que desea heredar los argumentos de constructor padre, que quiere decir que new DynamicBody(1, 2, 3) llamará internamente PhysicsBody(1, 2, 3) para la DynamicBody ejemplo.

Esto se puede lograr usando .apply y pasando arguments a lo largo de: http://jsfiddle.net/pmkrQ/.

function DynamicBody() { 
    PhysicsBody.apply(this, arguments); 
} 
+0

Hey gracias, no sabía nada de eso! – Jem

Cuestiones relacionadas