2013-06-07 3 views
0

Je suis un newbi JS essayant de créer un tableau d'objets. J'ai créé l'objet suivant:Tableau d'objets dans JS

gameCard = new Object({ 
    image : "", 
    container:"", 
    match2Card:"", 
    visible: false, 
    cardId:"", 

    updateCard: function (imageName,divName,matchingCard,isVisible,cardId) { 
     this.image = imageName; 
     this.container = divName; 
     this.match2Card = matchingCard; 
     this.visible = isVisible; 
     this.cardId = cardId; 
    }, 
    toggleCard: function(){ 
     if (this.visble) { 
      this.visble = false; 
     } 
     else { 
      this.visble = true; 
     } 
    }, 
    printCard : function() { 
     document.write (this.image + ' ' + this.container + ' ' + this.match2Card + ' ' + this.visible + ' ' + this.cardId + '<br>') ; 
     //alert (this.match2card); 
    } 
}) 

et exécutez la commande suivante:

gameCards = new Array(); 

for (i=0; i<20 ; i=i+1) { 
    z=i+1; 

    c1 = Math.floor((Math.random()*20)+1); 

    gameCard.updateCard ('images/bf'+i+'.jpg' , 'div' + c1 , z , false,i) ; 

    gameCards.push(gameCard); 
} 

lors de l'impression du tableau en utilisant:

for (i=0;i<20; i++) { 
    gameCards[i].printCard(); 
} 

tous les articles sont les mêmes.

qu'est-ce que je fais mal?

+3

Utiliser littéral d'objet formulaire ** {} ** au lieu de ** new Object() ** et même pour Array [] au lieu de new Array() – Givi

+2

Peut-être que vous mettez à jour la même instance tout le temps? – Rick

+0

Vous créez une seule carte, puis vous l'ajoutez à la matrice encore et encore. Vous devez créer plusieurs instances de carte dans votre boucle. –

Répondre

1

Vous utilisez un seul objet, vous devez utiliser

gameCard = {…} dans la boucle. (Nouvel objet n'est pas nécessaire)

for (var i = 0; i < 20; ++i) { 
    var gameCard = {…}; // create a new instance of object 
    … 
} 
+1

Le constructeur 'Object' n'utilise pas son argument pour l'initialisation; il le convertit en objet. Par conséquent, le constructeur 'Object' est inutile ici; l'initialiseur d'objet '{...}' crée déjà une instance 'Object' et évalue une référence à cette instance. – PointedEars

+1

@PointedEars Oui, mais l'important est de créer une nouvelle instance dans la boucle – Thierry

+0

@PointedEars quoi? cette réponse me semble juste. S'il y a une autre erreur commise par l'OP, cette réponse couvre la plus importante. – djechlin

1

Soit définir votre objet GameCard comme si (fiddle):

var GameCard = function() { //wrap in a function to mimic a constructor 
    return { 
     "image": "", 
     "container": "", 
     "match2Card": "", 
     "visible": false, 
     "cardId": "", 
     "updateCard": function (imageName, divName, matchingCard, isVisible, cardId) { 
      this.image = imageName; 
      this.container = divName; 
      this.match2Card = matchingCard; 
      this.visible = isVisible; 
      this.cardId = cardId; 
     }, 
     "toggleCard": function() { 
      this.visible = !this.visible; 
     }, 
     "printCard": function() { 
      log(this.image + ' ' + this.container + ' ' + this.match2Card + ' ' + this.visible + ' ' + this.cardId + '<br>'); 
     } 
    }; 
}; 

var test = function() { 
    var gameCards = [], 
     card = null, 
     i = 0; 
    for (i = 0; i < 20; i = i + 1) { 
     // call the function to get a new object 
     card = GameCard(); 
     // set object properties 
     z = i + 1; 
     c1 = Math.floor((Math.random() * 20) + 1); 
     card.updateCard('images/bf' + i + '.jpg', 'div' + c1, z, false, i); 
     // push into array 
     gameCards.push(card); 
    } 
    for (i = 0; i < 20; i++) { 
     gameCards[i].printCard(); 
    } 
}; 
test(); 

ou le définir comme celui-ci (fiddle):

var GameCard = function() { //or make a constructable object 
    this.image = ""; 
    this.container = ""; 
    this.match2Card = ""; 
    this.visible = false; 
    this.cardId = ""; 
    this.updateCard = function (imageName, divName, matchingCard, isVisible, cardId) { 
     this.image = imageName; 
     this.container = divName; 
     this.match2Card = matchingCard; 
     this.visible = isVisible; 
     this.cardId = cardId; 
    }; 
    this.toggleCard = function() { 
     this.visible = !this.visible; 
    }; 
    this.printCard = function() { 
     log(this.image + ' ' + this.container + ' ' + this.match2Card + ' ' + this.visible + ' ' + this.cardId + '<br>'); 
    }; 
}; 

var test = function() { 
    var gameCards = [], 
     card = null, 
     i = 0; 
    for (i = 0; i < 20; i = i + 1) { 
     // instantiate new object 
     card = new GameCard(); 
     // set properties 
     z = i + 1; 
     c1 = Math.floor((Math.random() * 20) + 1); 
     card.updateCard('images/bf' + i + '.jpg', 'div' + c1, z, false, i); 
     // push into array 
     gameCards.push(card); 
    } 
    for (i = 0; i < 20; i++) { 
     gameCards[i].printCard(); 
    } 
}; 
test(); 

Sinon, ce que vous faites est de pousser le même instanc e dans le tableau 20 fois.

MISE À JOUR

Vous pouvez également définir votre objet GameCard que vous faites actuellement et ensuite appeler Object.create(GameCard) pour créer une nouvelle instance de celui-ci (fiddle):

var GameCard = { 
    "image": "", 
    "container": "", 
    "match2Card": "", 
    "visible": false, 
    "cardId": "", 
    "updateCard": function (imageName, divName, matchingCard, isVisible, cardId) { 
     this.image = imageName; 
     this.container = divName; 
     this.match2Card = matchingCard; 
     this.visible = isVisible; 
     this.cardId = cardId; 
    }, 
    "toggleCard": function() { 
     this.visible = !this.visible; 
    }, 
    "printCard": function() { 
     log(this.image + ' ' + this.container + ' ' + this.match2Card + ' ' + this.visible + ' ' + this.cardId + '<br>'); 
    }; 

var test = function() { 
    var gameCards = [], 
     card = null, 
     i = 0; 
    for (i = 0; i < 20; i = i + 1) { 
     // use Object.create for a constructor 
     card = Object.create(GameCard); 
     // set properties 
     z = i + 1; 
     c1 = Math.floor((Math.random() * 20) + 1); 
     card.updateCard('images/bf' + i + '.jpg', 'div' + c1, z, false, i); 
     // push into array 
     gameCards.push(card); 
    } 
    for (i = 0; i < 20; i++) { 
     gameCards[i].printCard(); 
    } 
}; 
test(); 
+0

L'utilisation d'une fonction en tant que constructeur qui n'a pas de méthodes ou de propriétés de prototype pour renvoyer un objet est inutilement compliquée, sauf lorsque vous utilisez des fermetures (avez des "propriétés privées" dans le constructeur). – PointedEars

+0

oh mec tu m'as ninja'd. +1 – xdumaine

+0

Merci à tous pour votre aide, je vais vérifier ce que vous avez suggéré et je mettrai à jour si j'ai été capable de résoudre ce problème. – Avner