TypeError: undefined is not a function (Phaser JS)

TypeError: undefined is not a function (Phaser JS)

大家好,我只是想在 class 中执行一个方法,但它不起作用。 我收到 "Uncaught TypeError: undefined is not a function" 错误。

我正在调用其他函数并且它运行良好所以我不明白。我试过更改名称,但没有任何效果。

我认为我正在使用的 Phaser 有问题,但我不知道...

Bomb.prototype.collisionBlocs = function() {
    if (!this.hasBounced) {
        this.bounce();
        this.hasBounced = true;
    }
}

Bomb.prototype.bounce = function() {       
    if (this.direction == 'UP') {
        this.direction = 'DOWN';
    }
    else if (this.direction == 'RIGHT') {
        this.direction = 'LEFT';
    }
    else if (this.direction == 'DOWN') {
        this.direction = 'UP';
    }
    else if (this.direction == 'LEFT') {
        this.direction = 'RIGHT';
    }
}

"In fact, collisionBlocs() is a callback function from a phaser collision events : game.physics.arcade.collide(this.sprite, blocs, this.collisionBlocs); Maybe that's the problem"

成为问题所在。在 JS 中,函数内 this 的值取决于函数的调用方式。您将对 collisionBlocs 的引用传递给 .collide() 方法,当它调用它时,它不会正确设置 this,因此 this.bounce 将是 undefined

你需要强制this的值是正确的。最简单的方法是使用 .bind():

game.physics.arcade.collide(this.sprite, blocs, this.collisionBlocs.bind(this));

如果您需要支持这些浏览器,您可以使用 .bind() method is not supported in older browsers (IE <=8), but there is a polyfill

MDN 有更多关于 how this works in JavaScript 的信息。

与绑定 this 相比,使用 collide 提供给您的 callbackContext 参数会更容易。它是专门针对此问题添加的。这是方法签名:

collide: function (object1, object2, collideCallback, processCallback, callbackContext)

您没有使用 processCallback,因此您可以为此传递 null,但您确实需要上下文。这是将调用回调的上下文(尝试从 this 开始)。