Acabo de empezar a usar oop en javascript y me encontré con algunos problemas al tratar de acceder a un método desde dentro de otro método.objeto javascript, problema de auto referencia
aquí está el código que tenía:
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);
}
}
pero llamando a la Game.update() da un error que el método empate no está definido. No he podido encontrar una solución real para esto. finalmente me encontré con este How to call a method inside a javascript object donde la respuesta parece ser que necesito segura la referencia this como: var _this = this;
pero no pude conseguir que funcione en notación literal, por lo que cambió el código de constructor de objeto (supongo así es como se llama) y agregó la variable.
entonces cambió
this.draw();
a
_this.draw();
y funcionó.
aunque el
this.clear();
y la this.update() siguen siendo los mismos, nunca parecían dar errores en el primer lugar.
¿Alguien puede explicar por qué es esto? y tal vez apuntarme a una mejor solución? gracias de antemano.
actualización
Esto es lo que debe ser:
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);
}
}
¿Podría mostrar el código completo que funcionó? –
+1 por ser increíble y publicar su actualización. Esta publicación finalmente concretó las diferencias en los métodos alternativos de espaciado de nombres. Me hiciste un mejor codificador hoy. :) – Evildonald