JavaScript - 子继承会破坏父级

时间:2012-03-11 22:27:06

标签: javascript html canvas prototypal-inheritance

我仍然对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 个答案:

答案 0 :(得分:1)

第一部分代码有效,因为你不是调用引用TILE_SIZE的函数(即Block)直到第二部分代码,其中引用了变量,并产生参考错误,因为正如您所解释的那样,尚未定义。与继承无关,只是简单的旧js。

详细说明,函数的内部在调用函数之前不会执行,因此只要语法合法,即使定义了函数也没有错误,即使你这样做,也可以使用它作为函数。参考。

应该改变结构。配置细节是独立的,自然应该包含在相关代码之前(想想旧的C标准)。

答案 1 :(得分:1)

TILE_SIZE必须在之前定义 new Block();