2012-08-04 5 views
0

J'écris une application JavaScript simple. Le code consiste à créer un objet deck pouvant contenir de nombreux objets card imbriqués.Imbrication d'objets JavaScript

En fait, je voulais être en mesure d'accéder à chaque carte dans une instance de pont comme celui-ci:

deck1.card2.method(); 

Je l'ai utilisé la fonction suivante pour créer mon prototype de plate-forme:

function Deck(){ 
var cardStack = [] 
//deck properties & methods 
} 

function card(){ 
//card properties methods 
} 

Je J'ai ajouté chaque carte au deck et je les ai stockées dans le tableau cardStack, en utilisant les méthodes push et pop des tableaux JavaScript.

Cela ne me permet pas d'accéder à mes cartes que je voulais faire:

deck1.card2.method(); 

Quelqu'un peut-il me diriger dans la bonne façon d'y parvenir? Est-ce possible en JavaScript? Merci d'avance :-)

Répondre

1

Pour accéder aux objets de la carte unique, vous devrez rendre votre cardStack une propriété publique. A l'intérieur du constructeur, le this keyword est une référence à l'objet Deck courant, vous pouvez donc utiliser:

function Deck(){ 
    this.cards = []; 
    // deck properties & methods 
} 

Ensuite, accéder à une carte unique de var deck = new Deck(…) via deck.cards[2] et appeler une méthode de celui-ci. Vous pouvez également utiliser une fonction d'accès à l'ensemble cardStack. exemple étendu:

var Deck = (function() { 
    function Deck() { 
     var cardStack = []; 
     this.getCard = function(i) { return cardStack[i]; }; 

     for (var i=0; i<5; i++) 
      cardStack.push(new Card(i)); 
    } 
    function Card(i) { 
     this.method = function() { 
      alert("Hi, I'm card №"+i); 
     }; 
    } 
    return Deck; 
})(); 

var deck = new Deck(); 
deck.getCard(2).method(); // alerts "Hi, I'm card №2" 
+0

Est-il possible de ne pas permettre à un utilisateur de créer une carte sans créer un deck en premier? Je veux dire, ici, nous pouvons créer juste une instance de carte par nouvelle carte (i). Comment serait-il possible de réaliser cela? Merci pour votre aide! :-) – Hirvesh

+0

Vous pouvez utiliser [closure] (http://stackoverflow.com/q/111102/1048572) pour masquer le constructeur 'Card' du public. Mais pourquoi tu veux faire ça? – Bergi

+0

parce que chaque carte doit toujours appartenir à un deck: p Sans vouloir trop demander, pouvez-vous éditer votre exemple pour me montrer comment créer la fermeture et créer de nouvelles instances de cartes dans le deck? S'il vous plaît? – Hirvesh

2

Vous devez définir les objets et les fonctions en tant que propriétés de l'objet parent à l'aide this:

function Deck() { 
    this.cardStack = []; 
    this.card = function() { 
    console.log('Hullo'); 
    } 
} 

maintenant appeler la méthode fonctionne:

var deck = new Deck(); 
deck.card(); // Prints 'Hullo' 
+0

Puis-je avoir plusieurs instances de l'objet carte dans le deck? : $ – Hirvesh

+0

'this.cardStack' est un objet tableau, vous pouvez donc insérer autant de cartes que vous le souhaitez. – Blender

1

Vous pouvez mettre en œuvre une telle méthode dynamique en ajoutant simplement la propriété à votre objet lors de l'exécution dans la méthode où vous poussez votre carte ou plate-forme sur le tableau.

Par exemple:

var DeckStack = { 
    initialize: function() { 
     this.deckStack = []; 
    }, 

    addDeck: function (name) { 
     this.deckStack.push(name); 
     this['deck' + this.deckStack.length] = name; // <-- We add a method or property to the object dynamically 
    } 
}; 

DeckStack.initialize(); 
DeckStack.addDeck('test'); 
console.log(DeckStack.deck1); // Writes 'test' to console 

// This will show our new method/property as part of the object 
for (var meth in DeckStack) { 
    console.log(meth); 
} 

Peut-être que vous créez un objet de la carte. Si oui, vous utilisez:

var card = new Card(name); // For example 
this['deck' + this.deckStack.length] = card; 

et il serait disponible en tant que propriété sur votre objet de plate-forme.