2017-01-12 11 views
0

Я создал колоду карт, содержащую массив из 52 карточных объектов. Каждая карта наследует свойства и методы, определенные в функции cardObject(). Однако я смущен тем, как создать новую колоду и получить доступ к ее свойствам и методам.Javascript new function-object vs function-instantiation

// 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, поэтому он больше не является конструктором. Использование его с new или без него не имеет значения; это должна быть нормальная функция.

Причина, по которой регистрируется undefined, заключается в том, что сращивание возвращает массив удаленных элементов, а не только один (даже если вы только сплайсировали один элемент).

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; работа, если я не верну внутренний внутренний массив. любая разница в том, что происходит, если я просто сделаю свой путь против использования ** нового **? спасибо;) – Jamie