在JavaScript中挣扎着原型/继承

时间:2013-12-24 01:04:59

标签: javascript oop prototype prototypal-inheritance prototype-programming

我有一个小练习项目,我正在开发一个二十一点游戏。我使用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"!
    }
};
你能帮帮我吗?非常感谢你提前!

1 个答案:

答案 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()构造函数的重点
  • 您没有跟踪卡片中剩下的卡片,因此(无论多么不可能)随机卡片选择可以同时处理同一张卡片

......等等。)