2017-01-12 6 views
0

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つは、他の単なる配列を返す関数)を考えています。

答えて

1

PackOfCardsコンストラクタからオブジェクトを返したため、もはやコンストラクタではありません。 newの有無にかかわらず使用すると違いはありません。それはちょうど正常な機能でなければなりません。

undefinedがログに記録されている理由は、スプライスが削除されたアイテムの配列を返すためです(1つのアイテムをスプライスしただけであっても)。

shuffledDeck.push(unshuffledDeck.splice(tempPosition, 1)[0]); 

シャッフルのプロセスを別の関数に移動してインプレースすることは良い考えです。シャッフル部分を単独でテストすることができます。

function shuffle(collection) { 
    for (var i = 0; i < collection.length - 1; i++) { 
     var swap = i + (Math.random() * (collection.length - i) | 0); 
     var t = collection[i]; 
     collection[i] = collection[swap]; 
     collection[swap] = t; 
    } 
} 

function getPackOfCards() { 
    var deck = []; 
    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++) { 
     deck.push(new cardObject(listCardNum[i], listCardSuits[j])); //generating 52 new card objects 
    } 
    } 

    return deck; 
} 

var deck = getPackOfCards(); 
shuffle(deck); 
+0

感謝ライアン。つまり、PackOfCards()から何も返さなければ、コンストラクタとして機能するでしょうか?しかし、関数にはパブリックメソッドやプロパティがないので、何も返さずに新しいオブジェクトにそれらをどのように利用できるのでしょうか? var deck = ** new ** PackOfCards();まだ動作しますか? – Jamie

+0

@ Jamie:配列を返す関数が必要な場合は、それを行うだけです。すべてがコンストラクタである必要はありません。 – Ryan

+0

どのようにvar deck = ** new ** getPackOfCard;私は内部のプライベート配列を返していない場合に動作します。私はちょうど**新しい**を使用してあなたの方法を行う場合、ラインの下で任意の違いfurthur?ありがとう;) – Jamie

関連する問題