Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自定义对象';游戏';不';我没有指定的方法_Javascript_Function_Oop_Methods - Fatal编程技术网

Javascript 自定义对象';游戏';不';我没有指定的方法

Javascript 自定义对象';游戏';不';我没有指定的方法,javascript,function,oop,methods,Javascript,Function,Oop,Methods,我试图从函数游戏()调用一个方法cardSelection(),但是我得到了一个错误报告,它通过一个“has no method cardSelection()”将整个函数返回给我。这个想法是通过点击一个按钮来访问该方法,该HTML标记如下: <img id="PlayerCard0" class="card" src="images/Cards/Mario.png" alt="Mario" title="Mario" onclick="game.cardSelection('Player

我试图从
函数游戏()调用一个方法
cardSelection()
,但是我得到了一个错误报告,它通过一个“has no method cardSelection()”将整个函数返回给我。这个想法是通过点击一个按钮来访问该方法,该HTML标记如下:

<img id="PlayerCard0" class="card" src="images/Cards/Mario.png" alt="Mario" title="Mario" onclick="game.cardSelection('PlayerCard0')">
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);
}

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

您在这个问题上的关键点是
newgame()
game()
之间的区别

  • 告诉JS引擎创建一个新对象
  • 将该对象的原型(不是
    原型
    )指向
    游戏的
    原型
  • 然后调用函数game,但是为了该函数的主体
    这将引用创建的对象
  • 如果函数不返回对象,则将创建的对象指定给
    foo
    (否则将函数的返回值指定给
    foo
在游戏函数体中,您有
this.cardSelection=function(…
)。 如果您只是将
game
作为一个函数调用,那么只需
game()
,不使用
new
关键字,
函数体中的
这个
将是窗口对象!因此您将向窗口对象添加
cardSelection

同样重要的是:
game.cardSelection()
正在查找名为
cardSelection
的函数作为函数的属性

下面是一个使用该样式的示例:

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

游戏函数是如何调用的?它首先在打开屏幕时调用:[code]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);}[code]把这个放在问题中,不要放在评论中……评论中很难理解,这是问题的一部分。是的,很抱歉。请稍等。我已经编辑了。谢谢你的耐心。
var game = function () {
   //setup the game
};

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

var aGame = new game();

aGame.cardSelection();