Javascript 获取类型错误:无法调用未定义的getNumber方法

Javascript 获取类型错误:无法调用未定义的getNumber方法,javascript,undefined,typeerror,Javascript,Undefined,Typeerror,我正在做一个简单的21点程序。我对javascript完全陌生,调试程序时遇到困难。我一直得到TypeError:无法调用undefined的getNumber方法。。。。。我完全迷路了。我试图获取存储在每张卡上的数值,但似乎在Hand类中的printHand()方法中发生了错误。当打印出两张或更多卡片的手牌时,我通过调用cards[I].getNumber()循环手牌中的每张卡片,其中cards[]是每只手牌中的卡片数组。我是否没有正确地引用卡片[]?我反复检查以确保我的方法和变量设置为pub

我正在做一个简单的21点程序。我对javascript完全陌生,调试程序时遇到困难。我一直得到TypeError:无法调用undefined的getNumber方法。。。。。我完全迷路了。我试图获取存储在每张卡上的数值,但似乎在
Hand
类中的
printHand()
方法中发生了错误。当打印出两张或更多卡片的手牌时,我通过调用
cards[I].getNumber()
循环手牌中的每张卡片,其中
cards[]
是每只手牌中的卡片数组。我是否没有正确地引用卡片[]?我反复检查以确保我的方法和变量设置为public,但我仍然无法理解为什么对未定义的对象调用
getNumber()
。我引用此对象的方式是否有问题

这是我的密码:

 // Card Constructor
function Card (suit, number){
var the_suit = suit;
var the_number = number;

this.getNumber = function(){
    return the_number;
};
this.getSuit = function(){
    return the_suit;    
};
this.getValue = function (){
    // face cards
    if(the_number > 10){
        return 10;

    // aces
    } else if (the_number < 2){
        return 11;

    // other cards
    } else {
        return the_number;
    }   
};
}

function deal (){
// get card suit
var rand1 = Math.floor(Math.random ( ) * 4 + 1);
// get car number
var rand2 = Math.floor(Math.random ( ) * 13 + 1);

var newCard = new Card(rand1, rand2);
}

function Hand (){
// create two cards for initial hand
var card1 = deal();
var card2 = deal();
// store cards in array
var cards = [card1,card2];

// getter
this.getHand = function (){
    return cards;
};

// get the score
this.score = function(){
    var length = cards.length;
    var score = 0;
    var numAces = 0;

    for(i = 0; i < length; i++){
    if (cards[i].getValue() === 11 ){
    numAces++;
    }   
        score += cards[i].getValue();   
    }
    while(score > 21 && numAces !== 0){
        sum -= 10;
        numAces--;
    }
};
this.printHand = function(){
    var length = cards.length;

    for(i=0; i< length; i++){
    var string = string + cards[i].getNumber() + " of suit " + cards[i].getSuit() + ", ";
    }
    return string;
};

this.hitMe = function(){
    var newCard = deal();
    cards.push(newCard);

}
}

function playAsDealer(){
var newHand = new Hand();
while(newHand.score < 17){
    newHand.hitMe();
}
return newHand;
}

function playAsUser(){
var newHand = new Hand();
var choice = confirm("Current hand: "+ newHand.printHand() + ": Hold (Ok) or Stand(Cancel)");
while(choice){
    newHand.hitMe();
    choice = confirm("Current hand: "+ newHand.printHand() + ": Hold (Ok) or Stand(Cancel)");

}
}

function declareWinner(user, dealer){

//user wins case
if (user.score > dealer.score){
console.log("You are the Champion!");
}

// tie game
else if(user.score===dealer.score){
    console.log("Tied!");
}

else{
    console.log("Loser!!");
}

}


function playGame (){
var user = playAsUser();
var dealer = playAsDealer();
console.log("User's Hand: " + user.printHand());
console.log("Dealer's Hand: " + dealer.printHand());
declareWinner();
}


playGame(); 
//卡构造函数
功能卡(套装、号码){
var_suit=suit;
var_编号=编号;
this.getNumber=函数(){
返回_编号;
};
this.getSuit=函数(){
退还诉讼;
};
this.getValue=函数(){
//名片
如果(数量>10){
返回10;
//王牌
}否则如果(_编号<2){
返回11;
//其他卡片
}否则{
返回_编号;
}   
};
}
函数处理(){
//拿牌套装
var rand1=Math.floor(Math.random()*4+1);
//获取车号
var rand2=Math.floor(Math.random()*13+1);
var newCard=新卡(rand1,rand2);
}
功能手(){
//为第一手牌制作两张牌
var card1=deal();
var card2=deal();
//以阵列形式存储卡
var卡=[card1,card2];
//吸气剂
this.getHand=函数(){
回程卡;
};
//得分
this.score=函数(){
var length=cards.length;
var得分=0;
var numAces=0;
对于(i=0;i21&&numAces!==0){
总和-=10;
裸体--;
}
};
this.printHand=函数(){
var length=cards.length;
对于(i=0;idealer.score){
log(“你是冠军!”);
}
//平局
else if(用户分数===经销商分数){
console.log(“绑定!”);
}
否则{
log(“失败者!!”);
}
}
函数游戏(){
var user=playauser();
var经销商=Playas经销商();
log(“用户的手:+User.printHand());
console.log(“经销商的手:+Dealer.printHand());
declareWinner();
}
游戏();

在函数“交易”中不返回卡对象: 应该是:

function deal (){
   // get card suit
 var rand1 = Math.floor(Math.random ( ) * 4 + 1);
        // get car number
 var rand2 = Math.floor(Math.random ( ) * 13 + 1);

 var newCard = new Card(rand1, rand2);

 return newCard;
}

有几个问题,但要让您开始:

我得到的错误是“TypeError:cards[i]未定义”。因为您是这样调用deal()函数的:

var card1 = deal();
您需要在交易功能中归还卡,所以请更改

var newCard = new Card(rand1, rand2);


您还需要在打印手牌时将:cards[i].getNumber()转换为字符串

同样适用于“playasser”并将变量发送给declareWinner(用户、经销商);非常感谢。我尝试了弦乐的想法,但它似乎没有任何不同的方式。。。
return new Card(rand1, rand2);