2011-10-16 6 views
35

Ja przeglądając dyskusję na podobny temat, ale nie mogę znaleźć mojej sytuacji ...Dziedziczenie argumenty konstruktora rodzic

staram konstruktorów wezwanie rodzica z parametrami ... nie wydaje się uzyskać to prawo .

Mam PhysicsBody superklasę że trwa aNode jako jedynego argumentu konstruktora:

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

Z tej PhysicsBody dziedziczy klasę DynamicBody. Czy konstruktor przyjmuje również aNode jako jedyny argument ... Jakbym zrobił to w Javie, chciałbym nazwać coś równoważnego z "super(aNode"); Nie mogę się dowiedzieć, jak to zrobić.

Oto klasa 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); 
    //... 
} 

Odpowiedz

58

Jednym ze sposobów, aby to zrobić:

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

Teraz, kiedy robisz

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

instancja pb dostaje własności userData a także dziedziczy metody z PhysicsBody.prototype (pbMethod w tym przypadku).


Kiedy robisz

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

instancja db dostaje własności userData a także dziedziczy metody z DynamicBody.prototype (dbMethod w tym przypadku), co z kolei dziedziczy z PhysicsBody.prototype.

+0

Doskonale, dziękuję za poświęcony czas! – Jem

+0

Genialny! To mnie zepsuło od czasów starożytnych, ale było tak proste ... * facelap * –

+0

@ Lars-Erik Szczerze mówiąc, to bałagan :-). W nadchodzącym wydaniu JavaScript (ECMAScript 6) wprowadzona zostanie składnia klas, co znacznie uprości ten schemat. –

10

Jeśli rozumiem zostanie poprawnie, mówiąc chcesz dziedziczyć argumenty konstruktora rodzicem, to znaczy, że new DynamicBody(1, 2, 3) będzie wewnętrznie zadzwonić PhysicsBody(1, 2, 3) dla instancji DynamicBody.

Można to zrealizować, używając .apply i przekazując arguments wzdłuż: http://jsfiddle.net/pmkrQ/.

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

Hej, dzięki, nie wiedziałem o tym, że jeden! – Jem