javascript-объект, проблема с саморегулированием

Я только начал использовать oop в javascript и столкнулся с некоторыми проблемами, пытаясь получить доступ к методу изнутри другого метода.

вот код, который у меня был:

var Game = {
initialize: function () {
    if (canvas.isSupported()) {
        sprites[0] = new Player();

        this.update();
    }
},

update: function() {
    for (var i = 0; i < sprites.length; i++) {
        sprites[i].update();
    }

    this.draw();
},

draw: function() {
    this.clear();

    for (var i = 0; i < sprites.length; i++) {
        sprites[i].draw();
    }

    setTimeout(this.update, 10);
},

clear: function() {
    canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}

}

, но вызов Game.update () выдает ошибку о том, что метод рисования не определен. Я не мог найти для этого настоящего решения. в конце концов я нашел это Как вызвать метод внутри объекта javascript где ответ, похоже, заключается в том, что мне нужно сохранить эту ссылку, например: var _this = this; но я не мог заставить это работать в буквальной нотации, поэтому я изменил код на конструктор объекта (думаю, так он называется) и добавил переменную.

Затем я изменил

this.draw();

на

_this.draw();

, и это сработало .

хотя

this.clear();

и this.update () остались прежними, казалось, что они никогда не выдают ошибок.

Кто-нибудь может объяснить, почему это так? и, может быть, укажете мне лучшее решение? заранее спасибо.

update

Вот что должно быть:

var Game = function () {
var _this = this;

this.initialize = function () {
    if (canvas.isSupported()) {
        sprites[0] = new Player();

        this.update();
    }
}

this.update = function () {
    for (var i = 0; i < sprites.length; i++) {
        sprites[i].update();
    }

    this.draw();
}

this.draw = function () {
    this.clear();

    for (var i = 0; i < sprites.length; i++) {
        sprites[i].draw();
    }


    setTimeout(function () { _this.update(); }, 10);
}

this.clear = function () {
    canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}

}

10
задан Community 23 May 2017 в 12:22
поделиться