我一直在做以下事情:
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中执行此操作。
答案 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").... ];