0

我试图cardSelection()从 a调用一个方法,function game()但我收到一个错误报告,它用“没有方法 cardSelection()”将整个函数返回给我这个想法是通过单击一个按钮来访问该方法,其中的HTML标签如下:

<img id="PlayerCard0" class="card" src="images/Cards/Mario.png" alt="Mario" title="Mario" onclick="game.cardSelection('PlayerCard0')">

我没有发布整个 Javascript,因为我相信这只是一个声明错误的情况,无论如何,game()声明cardSelection()如下:

function game()
{
...
this.cardSelection = function(card)
{
    var cardElem = document.getElementById(card);
    var id = cardElem.getAttribute("id");
    var call = document.getElementById("call");

    var select = function(card)
    {


        var found = 0;
        for (var card = 0, totalCards = 5; card < totalCards; card++)
        {
            if (document.getElementById("PlayerCard" + card + "selected"))
            {found++}
        }
        if (found == 0)
        {
            call.setAttribute("onclick", "changeHand()");
            call.childNodes[0].nodeValue = "Change";
        }
        if (found < 3)
        {
            id += "selected"
            setAttributes(cardElem,
            {
                "id" : id,
                "style": "position: relative; top: 1em;",
                "onclick" : "cardSelection('" + id + "')"
            });
        }
        else { return; }
    }
    var unselect = function (card)
    {
        cardElem.removeAttribute("style");
        id = id.replace("selected","");
        setAttributes(cardElem,
        {
            "id" : id,
            "onclick" : "cardSelection('" + id + "')"
        });
        var cardNumber = 0;
        var found = false;
        while (cardNumber < 5 && !found)
        {
            if (document.getElementById("playerCard" + cardNumber + "selected"))
            {found = true;}
            cardNumber++;
        }
        if (!found)
        {
            call.setAttribute("onclick", "compareHands()");
            call.childNodes[0].nodeValue = "Hold";
        }
    }
    if (id.indexOf("selected") >= 0){unselect(card);}
    else {select(card);}
    }
    ...
}

怎么game()称呼:

window.onload = function openingScreen()
{
    var startGame = document.createElement("a");
    startGame.setAttribute("onclick", "game()");
    startGame.appendChild(document.createTextNode("Play"));
    window.table = document.getElementById("table");
    table.appendChild(startGame);
}
4

1 回答 1

0

您遇到的问题是对javascript 中的对象/类/实例混淆的结果。

new game()你在这个问题上的关键点是和之间的区别game()

var foo = new game()
  • 告诉 JS 引擎创建一个新对象
  • 将对象的原型(不是prototype)指向game'sprototype
  • 然后调用函数游戏,但为了该函数的主体,this将引用创建的对象。
  • 如果函数没有返回对象,则将我们创建的对象分配给foo(否则将函数的返回值分配给foo

在你的游戏函数体内,你有this.cardSelection = function (.... 如果你只是game作为一个函数调用,那么只要game()没有new关键字,this函数体内部就是窗口对象!因此,您将添加cardSelection到窗口对象。

同样重要的是:game.cardSelection()正在寻找一个名为 functioncardSelection的属性的函数 game

这是使用该样式的示例:

var foo = function () {
    //do interesting stuff
}

foo.bar = function () {
    //do interesting stuff related to foo
}

foo.bar();

您似乎期望的内容需要以这种方式编写:

var game = function () {
    this.cardSelection = function () {
        //perform card selection!
    }
}

var aGame = new game();

aGame.cardSelection();

或者,如果cardSelection不需要访问游戏的任何私有属性,则可以更有效地编写为

var game = function () {
   //setup the game
};

game.prototype.cardSelection = function () {
   //perform card selection
};

var aGame = new game();

aGame.cardSelection();
于 2013-12-16T05:32:50.553 回答