【问题标题】:Uncaught TypeError: object is not a function on object creation未捕获的类型错误:对象不是创建对象的函数
【发布时间】:2015-06-08 07:02:00
【问题描述】:
function coordinate(x, y) {
    this.x = x,
    this.y = y
}

function generateBaracade(numBlocks) {
    var coordinate = getRandomBaracadeCoordinate();
    var xStyle = expandDirection.down;
    var yStyle = expandDirection.right;
    var xNumBlocks = findRandomFactor(numBlocks);
    var yNumBlocks = numBlocks / xNumBlocks;

    //figure out which way to expand the blocks
    if (coordinate.x + xNumBlocks > xBlocks) {
        xStyle = expandDirection.left;
    } else {
        xStyle = expandDirection.right;
    }

    if (coordinate.y + yNumBlocks > yBlocks) {
        yStyle = expandDirection.down;
    } else {
        yStyle = expandDirection.up;
    }

    for (var i = 0; i <= xNumBlocks - 1; i++) {
        for (var j = 0; j <= yNumBlocks - 1; j++) {
            var tempBlock = Object.create(block);
            tempBlock.type = "obstruction";
            tempBlock.color = "grey";
            tempBlock.illegalTerrain = true;
            tempBlock.coordinate = new coordinate(coordinate.x + (i * xStyle), coordinate.y + (j * yStyle));
            blockContainer[coordinate.x + (i * xStyle)][coordinate.y + (j * yStyle)] = tempBlock;
        };
    };
}

我得到'Uncaught TypeError: object is not a function'就行了:

tempBlock.coordinate = new coordinate(coordinate.x + (i * xStyle), coordinate.y + (j * yStyle));

这很奇怪,因为我正在按照 Mozilla 指南执行此操作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

编辑:getRandomBaracadeCoordinate 的来源。 return 语句正是我想要做的,并且执行没有错误。

function getRandomBaracadeCoordinate() {
    var x = Math.floor((Math.random() * (xBlocks)));
    var y = Math.floor((Math.random() * (yBlocks)));
    return new coordinate(x, y);
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您通过在getBaracade 的第一行提供相同名称的其他内容来隐藏coordinate 函数:

    var coordinate = getRandomBaracadeCoordinate();
    

    getRandomBaracadeCoordinate() 返回的不是函数,所以new coordinate 会引发错误。

    【讨论】:

      【解决方案2】:

      coordinate 是一个包含{ x, y } 的对象,并在此处初始化:

      var coordinate = getRandomBaracadeCoordinate();
      

       

      tempBlock.coordinate = new coordinate(coordinate.x + (i * xStyle), coordinate.y + (j * yStyle));
      

      可能您输入错误的是 new coordinate() 而不是 new Coordinate()(如果 Coordinate 是一个类)。

      您应该查看getRandomBaracadeCoordinate() 的来源——如果它返回某个类的对象,您应该创建该类的一个实例。否则,如果它返回一个简单的 { x:50, y:15 } 对象,您可以内联创建它:

      tempBlock.coordinate = { x: coordinate.x + (i * xStyle), y: coordinate.y + (j * yStyle) };
      

      【讨论】:

      • 您的答案似乎不对。来源:函数 getRandomBaracadeCoordinate() { var x = Math.floor((Math.random() * (xBlocks))); var y = Math.floor((Math.random() * (yBlocks)));返回新坐标(x,y);我不明白为什么我不能在另一个函数中做同样的事情。
      • 啊,现在我明白了。您已经使用名为 coordinate 的变量覆盖了名为 coordinate 的类。将其名称更改为其他名称:var coord = getRandomBaracadeCoordinate()
      • getRandomBaracadeCoordinate 是一个函数,但getRandomBaracadeCoordinate() 返回一个对象,在generateBaracade 的第一行,您将该对象分配给变量coordinate,它会覆盖("shadows ") generateBaracade 中的 coordinate 函数。稍后在generateBaracade 执行new coordinate 时,coordinate 仍然是那个对象,而不是函数,所以它会引发错误。
      • 这个错误正是为什么有一个经常使用的约定以大写开头的类名和以小写开头的变量名的原因。
      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多