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