如何用对象实例化javascript数组?

时间:2014-01-17 20:19:58

标签: 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" }
    ];
 });

但是,我决定添加另一个名为“card”的对象......

 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中执行此操作。

2 个答案:

答案 0 :(得分: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;
}

或者,如果您希望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;
    }
};

答案 1 :(得分: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").... ];