OO em Java Script

4 respostas
J

Bem, galera, eu to desenvolvendo um código que contém a seguinte classe:

function Tabuleiro(){
    
    var malha_aux = new Array(2);
    malha_aux[0] = new Array(20);
    malha_aux[1] = new Array(20);
    
    this.malha = malha_aux;
    this.getMalha = getMalha;
    this.setMalha = setMalha;
    this.getPos = getPos;
    this.setPos = setPos;
    this.initTabuleiro = initTabuleiro;
    
    function getMalha(){
        return malha;
    }
    
    function setMalha(malha){
        this.malha = malha;
    }
    
    function getPos(indx_X, indx_Y){
        return this.malha[indx_X][indx_Y];
    }
    
    function setPos(indx_X, indx_Y, content){
        this.malha[indx_X][indx_Y] = content;
    }
    
    function initTabuleiro(){
        for(var i=0; i<20; i++){
            for(var j = 0; j<20; j++){
                this.malha[i][j] = 0;
            }
        }
    }
}

Mas quando instancio um objeto dessa classe e chamo o método initTabuleiro(), o console de erros do Firefox diz que "this.malha[i] is undefined".
Já to desesperado aki… O q foi q eu fiz de errado? Ajuda ae galera. Sô iniciante no javascript e preciso aprender mais.
Flws!

4 Respostas

adrianoms

cara tem um erro basico de logica
teu loop tenta varer uma matriz de 20X20 mas vc posui uma matriz de 2x20

tente trocar o loop por esse aqui e veja se funciona

function initTabuleiro(){ for(var i=0; i<2; i++){ for(var j = 0; j<20; j++){ this.malha[i][j] = 0; } } }

J

mas eu preciso da matriz 20 por 20

adrianoms

Você pode fazer a inicialização assim

modo normal

var malha = new Array[20]
for(var i=0; i<20; i++){  
  malha[i] = new Array[20]       
}

modo POGer

//nessas horas eu penso se é bom ou ruim saber usar macro
    var malha = new Array(20);  
    malha[0] = new Array(20);  
    malha[1] = new Array(20);
    malha[2] = new Array(20);  
    malha[3] = new Array(20);
    malha[4] = new Array(20);  
    malha[5] = new Array(20);
    malha[6] = new Array(20);  
    malha[7] = new Array(20);
    malha[8] = new Array(20);
    malha[9] = new Array(20);  
    malha[10] = new Array(20);
    malha[11] = new Array(20);
    malha[12] = new Array(20);  
    malha[13] = new Array(20);
    malha[14] = new Array(20);  
    malha[15] = new Array(20);
    malha[16] = new Array(20);  
    malha[17] = new Array(20);
    malha[18] = new Array(20);
    malha[19] = new Array(20);
W

Ola,
soh uma dica, seria ideal vc usar namespace pattern para os seus scripts, da uma olhada no seu script modificado:

// verifica se MeuJogoAPI existe, caso contrario cria um novo.
var MeuJogoAPI = MeuJogoAPI || {}

MeuJogoAPI.Tabuleiro = function() {

	// private
	var malha;

	function getMalha(){  
		return malha;  
	}
	
	function setMalha(malha){  
		this.malha = malha;  
	}
      
	function getPos(indx_X, indx_Y){  
		return this.malha[indx_X][indx_Y];  
	}        
        
	function setPos(indx_X, indx_Y, content){  
		this.malha[indx_X][indx_Y] = content;  
	}  
      
	function initTabuleiro(){  
		// essa funcao vc tem que reescrever, tem maneiras mais faceis
        // talvez como o adrianoms sugeriu???
	}  
	
	// funcoes que vc quer expor (publicas).
	return {
		getMalha: getMalha,
		setMalha: setMalha,
		getPos: getPos,
		setPos: setPos,
		initTabuleiro: initTabuleiro		
	}	
}

vc poderia tb definir as funcoes publicas diretamente dentro do return, por exemplo:

return {
       getMalha: function() {
            return malha;
       }
}

Dessa forma vc tem um maior controle o que eh privado e publico no seu objeto.

Outra coisa, menos importante, mas vale a pena citar, ao inves de passar duas variaveis (indx_X, indx_Y) para as funcao toda hora,
talvez seja mais “limpo”, passar um objeto, por exemplo:

function setPos(coordenadas, content){  
      this.malha[coordenadas.x][coordenadas.y] = content;  
}

Ai vc chamaria assim:

var coordenadas = { x: 10, y: 2 };
setPos(coordenadas, content);

//Daniel

Criado 29 de maio de 2011
Ultima resposta 30 de mai. de 2011
Respostas 4
Participantes 3