Унаследовать аргументы родительского конструктора - PullRequest
35 голосов
/ 16 октября 2011

Я просматриваю обсуждение на похожую тему, но не могу найти свою ситуацию ...

Я пытаюсь вызвать родительские конструкторы с параметрами ... не могу понять, что это правильно.

У меня есть PhysicsBody суперкласс, который принимает aNode в качестве единственного аргумента конструктора:

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

Из этого PhysicsBody наследуется класс DynamicBody. Это конструктор также принимает aNode в качестве единственного аргумента ... Как я бы сделал это в Java, я бы хотел назвать что-то эквивалентное "super(aNode"); Не могу понять, как.

Вот класс 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);
    //...
}

Ответы [ 2 ]

58 голосов
/ 16 октября 2011

Один из способов сделать это:

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

Теперь, когда вы делаете

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

, экземпляр pb получает свойство userData и также наследуетметоды из PhysicsBody.prototype (pbMethod в данном случае).

image


Когда вы делаете

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

, экземпляр db получаетuserData, а также наследует методы от DynamicBody.prototype (dbMethod в данном случае), который, в свою очередь, наследует от PhysicsBody.prototype.

image

10 голосов
/ 16 октября 2011

Если я вас правильно понимаю, говоря, что вы хотите наследовать аргументы родительского конструктора, вы имеете в виду, что new DynamicBody(1, 2, 3) будет внутренне вызывать PhysicsBody(1, 2, 3) для экземпляра DynamicBody.

Это может быть выполненоиспользуя .apply и передавая arguments вдоль: http://jsfiddle.net/pmkrQ/.

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