JavaScript - дочернее наследство ломает родителя - PullRequest
2 голосов
/ 12 марта 2012

Я все еще довольно новичок в наследовании прототипов в JS, и у меня возникла странная ошибка, которую я не могу понять. Мы пишем игру, используя canvas, и у нас есть код, который выглядит примерно так:

function GameObject() {
    // Generic object that everything inherits from
    this.x = 0;
    this.y = 0;
    this.dx = -0.5;
    this.dy = 0;
    this.width = 0;
    this.height = 0;
    this.sprite = new Image();
    this.sprite.src = "";
}

function Block(x,y) {
    this.x = x;
    this.y = y;
    this.width  = 2 * TILE_SIZE;
    this.height = 2 * TILE_SIZE;
    this.sprite.src = "images/block/block3.png";                      
    blocks.push(this); // Manager array
}

Block.prototype = new GameObject();
Block.prototype.constructor = Block;

Этот код работает нормально. Обратите внимание, что TILE_SIZE определяется в отдельном файле, который включается ПОСЛЕ блочного скрипта - здесь это не проблема. Но когда мы добавим следующий код (после функции Block):

function Block_Turret(x,y) {}
Block_Turret.prototype = new Block();
Block_Turret.prototype.constructor = Block_Turret;

Я получаю Uncaught ReferenceError, что TILE_SIZE не определен в функции Block! Кажется, что ребенок ломает родителя, и я понятия не имею, почему это так - это выглядит довольно простым сценарием наследования. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2012

TILE_SIZE должен быть определен до , который вы делаете new Block();

1 голос
/ 12 марта 2012

Код первого раздела работает, потому что вы не вызываете функцию, которая ссылается на TILE_SIZE (то есть Block) до этого второго раздела кода, на который ссылается переменная, и производит ссылку ошибка, так как она, как вы объяснили, еще не определена. Ничего общего с наследованием, просто старый js.

Для уточнения, внутренние функции функции не выполняются до тех пор, пока функция не будет вызвана, поэтому, пока синтаксис допустим, ошибки нет, даже если функция определена, и даже если вы это делаете, используйте ее как ссылка.

Структура должна быть изменена. Детали конфигурации, которые являются независимыми, естественно должны быть включены перед зависимым кодом (подумайте о старых стандартах C).

...