对象不会被创建?

时间:2014-02-11 01:05:15

标签: javascript object compiler-errors undefined instantiation

我正在制作蛇游戏但是当我尝试实例化我的蛇对象时,我得到“未捕获的TypeError:undefined不是函数”。

function draw(){
var canvas = document.getElementById("canvas");
    if (canvas.getContext){
        var ctx = canvas.getContext('2d');
}
drawSnake();    

}

这是我实例化蛇对象并绘制它的地方,我更明确地得到错误的第13行。

function drawSnake(){
    var Snake = new Snake(250,250,-1,0);
    Snake.create();
    ctx.fillStyle = "white";
    for(i=Snake.snakeBlock.length(); i>=0;i--){
        var s = Snake.snakeBlock[i].block;
        ctx.fillRect(s.xPos,s.xPos,s.height,s.width);
    }
}    

function Block(x,y,w,h){
    var xPos = x;
    var yPos = y;
    var width = w;
    var height = h;
}

这是我定义蛇对象的地方,但我仍然遇到错误。

function Snake(x,y,dY,dX){
    var snakeBlock = [];
    var length = 20;
    var xPos = x;
    var yPos = y;
    var dirX = dX;
    var dirX = dY;
    Snake.prototype.create = function(){
        for (var i = 0; i <= length; i++) {
        snakeBlock.push(new Block((xPos-(i*10))*dirX, (yPos-(i*10))*dirY,10,10));
    };
}
}

在创建对象时是否有一些我无视的东西,因为我无法弄清楚代码有什么问题。

2 个答案:

答案 0 :(得分:2)

您粘贴的代码存在很多问题。我已经创建了一个非常快速的小提琴,并调整了您的代码,以便它不会出错(尽管它可能不是编写它的最佳方式)。

http://jsfiddle.net/62VDC/

我发现的一些事情与不使用this有关。尝试将变量名Snake与名为Snake的对象同时使用。当没有snakeBlock[i].block组件时,引用block之类的内容。使用length()时,只需使用.length。将prototype函数放在construtor中。

如果您需要更多帮助,可能需要详细说明。

答案 1 :(得分:1)

var Snake = new Snake(250,250,-1,0);

您是否尝试在此处覆盖Snake构造函数?无论如何,declaration of the local variable阴影全局Snake构造函数引用,Snakeundefined当您尝试调用它时。使用不同的变量名称 - 通常实例名称是小写的:

var snake = new Snake(250, 250, -1, 0);
for(i=Snake.snakeBlock.length(); i>=0;i--){
  • 使用本地变量:var i
  • .length确实不是一个功能:it is a plain, numeric property
  • snakeBlockSnake构造函数中的局部变量,而不是属性。
    var s = Snake.snakeBlock[i].block;

snakeBlock[i]已经引用了你放在那里的Block个实例。它没有.block属性。

    var snakeBlock = [];

如前所述,这确实声明了一个局部变量。但是,您希望从外部访问它(在原型方法中,在drawSnake调用中),因此您应该创建一个属性:

this.snakeBlock = [];

详细了解Javascript: Do I need to put this.var for every variable in an object?中的差异。

    Snake.prototype.create = function(){

永远不要在构造函数中对原型进行赋值!你的缩进也搞砸了。

snakeBlock.push(…)

现在,将其作为属性访问:

this.snakeBlock.push(…)

另请参阅@MattWay's fiddle了解固定版本: - )