我有一个小练习项目,我正在开发一个二十一点游戏。我使用JS原型进行OOP目的,到目前为止效果很好。我有一个Game,Card和Hand(玩家拥有的所有牌)原型对象。 现在我的Hand原型出了问题。 它返回我的卡片值“undefined”。我不知道什么是错误,因为我的Hand构造函数返回正确的值。
我不得不承认我对JS原型的理解可能不是最好的,所以这可能是我遇到的问题吗?!
这是我的代码中的相关摘录:
var suits = ["club", "diamond", "heart", "spade"];
var cardValue = ["ace", 2, 3, 4, 5, 6, 7, 8, 9, "jack", "queen", "king"];
function Game() {
}
Game.prototype = {
deal: function() {
var cardSuit = Math.floor(Math.random() * suits.length);
var cardNumber = Math.floor(Math.random() * cardValue.length);
return cardSuit, cardNumber;
},
createHand: function() {
var newHand = new Hand();
var userCards = newHand.getHand();
return newHand;
}
};
var card1, card2, handCards;
function Hand() {
var card1 = Game.prototype.deal(); //works! return two values
var card2 = Game.prototype.deal(); //works! return two values
var handCards = [card1, card2]; //works! creates array from card 1 and 2
}
Hand.prototype = {
getFirstCard: function() {
return card1; // IS "UNDEFINED"!
},
getSecondCard: function() {
return card2; // IS "UNDEFINED"!
},
getHand: function() {
return handCards; // IS "UNDEFINED"!
}
};
你能帮帮我吗?非常感谢你提前!
答案 0 :(得分:3)
您在没有赋值的情况下声明一些全局变量:
var card1, card2, handCards;
然后在小时Hand()
函数中,您声明与该函数 local 同名的变量:
function Hand() {
var card1 = Game.prototype.deal();
// etc.
然后你的其他函数尝试访问从未赋值的全局变量:
getFirstCard: function() {
return card1; // IS "UNDEFINED"!
},
如果要从“类”的方法访问这些值,这些变量应该是实例变量:
function Hand() {
this.card1 = Game.prototype.deal(); //works! return two values
this.card2 = Game.prototype.deal(); //works! return two values
this.handCards = [this.card1, this.card2]; //works! creates array from card 1 and 2
}
...
getFirstCard: function() {
return this.card1;
},
...在使用这些变量的其他方法中等等。您可以删除var card1, card2, handCards;
行。
或者这样做可能更整洁:
function Hand() {
this.handCards = [Game.prototype.deal(), Game.prototype.deal()];
}
...
getFirstCard: function() {
return this.handCards[0];
},
getSecondCard: function() {
return this.handCards[1];
},
(您的代码中还有其他问题,例如:
cardValue
数组缺少10
return cardSuit, cardNumber;
将返回cardNumber
createHand()
函数声明并设置一个永不使用的userCards
变量Game()
个对象并且只调用原型的方法Game
Game.prototype.deal()
构造函数的重点
......等等。)