2014-01-17 3 views
1

Я делаю очень хорошо следующее:Как создать экземпляр массива javascript с объектами?

var game = function() { 
    var self = this; 
    self.deck = [ 
     { id: 1, name: "Ace", suit: "Spade" }, 
     { id: 2, name: "King", suit: "Spade" }, 
     { id: 3, name: "Queen", suit: "Spade" } 
    ]; 
}); 

Однако, я решил добавить еще один объект под названием «карта» ...

var card = function() { 
    var self = this; 

    self.id = ko.observable(); 
    self.name = ko.observable(); 
    self.suit = ko.observable(); 

    self.someUsefulMethod = function() { 
     // does something useful ... 
    }); 
}); 

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

В C# я бы сделать следующее ...

var deck = new List() { 
    new Card { id = 1, name = "Ace", suit = "Spade" }, 
    new Card { id = 2, name = "King", suit = "Spade" }, 
    new Card { id = 3, name = "Queen", suit = "Spade" }, 
}; 

... но я не знаю, как сделать это в JavaScript.

ответ

3

При создании колоды, вы просто поставить объекты карты в нем, а не простые объекты:

Так, а не это:

self.deck = [ 
    { id: 1, name: "Ace", suit: "Spade" }, 
    { id: 2, name: "King", suit: "Spade" }, 
    { id: 3, name: "Queen", suit: "Spade" } 
]; 

Вы делаете что-то вроде этого:

self.deck = [ 
    new Card(1, "Ace", "Spade"), 
    new Card(2, "King", "Spade"), 
    new Card(3, "Queen", "Spade") 
]; 

И, у НУ создать объект карты, который принимает соответствующие аргументы в конструкторе:

function Card(id, name, suit) { 
    this.id = id; 
    this.name = name; 
    this.suit = suit; 
} 

В самом деле, вы, вероятно, хотите автоматизировать это так:

function createDeck() { 
    var deck = []; 
    var cardSuits = ["Spade", "Hearts", "Diamonds", "Clubs"]; 
    var cardNames = ["Ace", "King", "Queen", "Jack", "Ten", "Nine", ...]; 

    for (var s = 0; s < cardSuits.length; s++) { 
     for (var n = 0; n < cardNames.length; n++) { 
      deck.push(new Card(n + 1, cardSuits[s], cardNames[n])); 
     } 
    } 
    return deck; 
} 

Или, если вы хотите палубе быть объект, который вы создаете с помощью new deck():

function Deck() { 
    this.cards = []; 
    var cardSuits = ["Spade", "Hearts", "Diamonds", "Clubs"]; 
    var cardNames = ["Ace", "King", "Queen", "Jack", "Ten", "Nine", ...]; 

    for (var s = 0; s < cardSuits.length; s++) { 
     for (var n = 0; n < cardNames.length; n++) { 
      this.cards.push(new Card(n + 1, cardSuits[s], cardNames[n])); 
     } 
    } 
} 

Deck.prototype = { 
    dealCards: function(numberOfCards) { 
     numberOfCards = Math.min(numberOfCards, this.cards.length); 
     var cards = [], rand; 
     for (var i = 0, i < numberOfCards; i++) { 
      rand = Math.floor(Math.random() * this.cards.length); 
      cards.push(this.cards[rand]); 
      this.cards.splice(rand, 1); 
     } 
     return cards; 
    }, 
    dealHands: function(numHands, numCards) { 
     numCards = Math.min(Math.floor(this.cards.length/numHands), numCards); 
     var hands = []; 
     for (var i = 0; i < numHands; i++) { 
      hands.push(this.dealCards(numCards)); 
     } 
     return hands; 
    } 
}; 
+0

Добавлены некоторые дополнительные методы для объекта Deck. – jfriend00

+0

Говоря о более сложных колодах, чтобы играть с .... симпатичной старой-JS-совместимой колодой. –

+0

Спасибо, отличные примеры. –

2

Ваша функция карты еще не является конструктором, и по условному обозначению должно быть указано Card не card. Есть более сложные подходы, которые могут быть приняты, но это должно вам начать ...

var Card = function(id, name, suit) { 
    this.id = ko.observable(id); 
    this.name = ko.observable(name); 
    this.suit = ko.observable(suit); 

    this.somethingRequiringThis = function() { 
     alert(self.suit + ' ' + self.name); 
    }; 
} 

var deck = [ new Card(1, "ace", "spades"), new Card(2, "deuce", "spades").... ]; 
Смежные вопросы