2011-10-16 29 views
35

sto navigando la discussione di un argomento simile, ma non riesco a trovare la mia situazione ...Eredita argomenti del costruttore genitore

sto cercando costruttori genitore chiamata con parametri ... non riesco a farlo bene .

Ho una superclasse PhysicsBody che prende aNode come suo unico argomento del costruttore:

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

Di questo PhysicsBody eredita una classe DynamicBody. Il costruttore prende anche aNode come argomento solo ... Come lo farei in Java, mi piacerebbe chiamare qualcosa di equivalente a "super(aNode"); Non riesco a scoprire come.

Ecco la classe 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); 
    //... 
} 

risposta

58

Un modo per farlo:

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() {}; 

Ora, quando si fa

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

l'istanza pb ottiene una proprietà userData ed eredita anche i metodi da PhysicsBody.prototype (pbMethod in questo caso).


Quando si esegue

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

l'istanza db ottiene una proprietà userData e anche eredita i metodi da DynamicBody.prototype (dbMethod in questo caso), che a sua volta eredita da PhysicsBody.prototype.

+0

Eccellente, grazie per il tuo tempo! – Jem

+0

Brillante! Questo mi ha illuso dai tempi antichi, eppure era così semplice ... * faceslap * –

+0

@ Lars-Erik Ad essere sincero, è un casino :-). La prossima edizione di JavaScript (ECMAScript 6) porterà la sintassi della classe, che renderà questo schema molto più semplice. –

10

Se ho capito bene, dicendo che si desidera ereditare le argomenti del costruttore genitore, vuoi dire che new DynamicBody(1, 2, 3) sarà internamente chiamare PhysicsBody(1, 2, 3) per l'istanza DynamicBody.

Questo può essere eseguito utilizzando .apply e passando arguments lungo: http://jsfiddle.net/pmkrQ/.

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

Ehi, grazie, non sapeva di che uno! – Jem

Problemi correlati