52個のカードオブジェクトの配列を含むカードのデッキを作成しました。各カードは、cardObject()関数で定義されたプロパティとメソッドを継承します。しかし、私は新しいデッキを作成し、そのプロパティとメソッドにアクセスする方法と混同しています。ここでJavascript新しい関数オブジェクトと関数のインスタンス化
// Defining properties and methods for every single card object created by PackOfCards function
function cardObject(cardNum, cardSuit) {
this.cardNum = cardNum;
this.cardSuit = cardSuit;
}
cardObject.prototype.getCardValue = function() {
if (this.cardNum === "jack" || this.cardNum === "queen" || this.cardNum === "king") {
return 10;
} else if (this.cardNum === "ace") {
return 11;
} else {
return this.cardNum;
}
}
cardObject.prototype.getCardSuit = function() {
return this.cardSuit;
}
// Creating a deck of shuffled card where every card inherits properties and methods defined in cardObject function
function PackOfCards() {
var unshuffledDeck = [],
shuffledDeck = [];
var listCardNum = ["ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "jack", "queen", "king"];
var listCardSuits = ["clubs", "diamonds", "hearts", "spades"];
for (var i = 0; i < listCardNum.length; i++) {
for (var j = 0; j < listCardSuits.length; j++) {
unshuffledDeck.push(new cardObject(listCardNum[i], listCardSuits[j])); //generating 52 new card objects
}
}
var lengthCounter = unshuffledDeck.length;
while (lengthCounter > 0) { // shuffling the 52 unshuffled cards randomly
var tempPosition = Math.floor(Math.random() * lengthCounter);
shuffledDeck.push(unshuffledDeck.splice(tempPosition, 1));
lengthCounter--
}
return shuffledDeck;
}
var newDeckObj = new PackOfCards; // I've considered PackOfCards as constructer function here
var newDeckInstance = PackOfCards(); // I've created a variable that stores a new instance of PackOfCards() function that returns an array
console.log(newDeckObj[5].getCardValue);
console.log(newDeckObj[5].getCardValue);
私はnewDeckObjとnewDeckInstance間の実際の真のコアの違いを見つけることができません。
両方に52個のオブジェクトの配列が含まれていますが、そのプロパティにアクセスしようとして定義されていません。私は両方の変数がPackOfCards()関数のコピーであると思うが、私は完全に理解することができません別のアプローチ(1つは、他の単なる配列を返す関数)を考えています。
感謝ライアン。つまり、PackOfCards()から何も返さなければ、コンストラクタとして機能するでしょうか?しかし、関数にはパブリックメソッドやプロパティがないので、何も返さずに新しいオブジェクトにそれらをどのように利用できるのでしょうか? var deck = ** new ** PackOfCards();まだ動作しますか? – Jamie
@ Jamie:配列を返す関数が必要な場合は、それを行うだけです。すべてがコンストラクタである必要はありません。 – Ryan
どのようにvar deck = ** new ** getPackOfCard;私は内部のプライベート配列を返していない場合に動作します。私はちょうど**新しい**を使用してあなたの方法を行う場合、ラインの下で任意の違いfurthur?ありがとう;) – Jamie