【问题标题】:Javascript new function-object vs function-instantiationJavascript 新函数对象与函数实例化
【发布时间】:2017-01-12 13:22:31
【问题描述】:

我创建了一副包含 52 个卡片对象的卡片组。每张卡片都继承了 cardObject() 函数中定义的属性和方法。但是,我对如何创建新牌组并访问其属性和方法感到困惑。

// 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() 函数的一些副本,但采用了不同的方法(一个认为它是一个构造函数,而另一个只是一个返回数组的函数),我无法完全理解。

【问题讨论】:

    标签: javascript function oop


    【解决方案1】:

    您从 PackOfCards 构造函数返回了一个对象,因此它不再是构造函数。使用或不使用new 没有区别;它应该只是一个正常的功能。

    undefined 被记录的原因是因为 splice 返回一个已删除项目的数组,而不仅仅是一个(即使您只拼接了一个项目)。

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

    不过,将 shuffle 的过程转移到另一个函数中并在原地执行它是一个好主意;它可以让你自己测试洗牌部分。

    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);
    

    【讨论】:

    • 谢谢瑞恩。所以你的意思是如果我不从 PackOfCards() 返回任何东西,它将充当构造函数?但是该函数没有公共方法或属性,那么新对象如何在不返回任何内容的情况下使用这些方法或属性?将 var deck = new PackOfCards();还在工作吗?
    • @Jamie:如果你想要一个返回数组的函数,你可以这样做。并非所有东西都必须是构造函数。
    • 那么 var deck = new getPackOfCard;如果我不返回内部私有数组,则工作。如果我只是按照你的方式与使用 new 相比,有什么不同吗?谢谢;)
    • @Jamie 没有“内部私有数组”。 getPackOfCards() 只返回一个 cardObjects 数组。这不是面向对象的,但它有效。如果您想像游戏一样做,以后实现其他功能可能会更难,但并非不可能。
    • @Jamie:除非您有构造函数,否则不要使用newgetPackOfCards 只是一个普通函数,你可以使用 var deck = getPackOfCards();。如果你想让它成为构造函数PackOfCards,你可以设置this.cards = deck;什么的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2012-03-02
    • 2014-02-14
    • 2017-01-23
    相关资源
    最近更新 更多