Javascript 未捕获的TypeError无法读取属性';名称';未定义的

Javascript 未捕获的TypeError无法读取属性';名称';未定义的,javascript,jquery,object,Javascript,Jquery,Object,我是Javascript/jquery新手,在开发一个应用程序时遇到了问题。在尝试读取对象的属性时,我遇到了一个未捕获的类型错误。我的最终目标是让用户在文本框中输入一些内容,并基于该输入创建一个对象,将该输入作为名称属性。以下是我目前的代码: $(document).ready(function(){ var playerArray = []; var playerIndex = 0; function player (name) { this.name

我是Javascript/jquery新手,在开发一个应用程序时遇到了问题。在尝试读取对象的属性时,我遇到了一个未捕获的类型错误。我的最终目标是让用户在文本框中输入一些内容,并基于该输入创建一个对象,将该输入作为名称属性。以下是我目前的代码:

$(document).ready(function(){
    var playerArray = [];
    var playerIndex = 0;

    function player (name) {
        this.name = name;
        score = 0;
    };

    var addPlayer = function(name){
        playerArray[playerIndex] = new player(name);
        playerIndex++;
    };

    $('#add_players').on('click', '#btn-add', function(){
        var toAdd = $('input[name=playerNameInput]').val();
        addPlayer(toAdd);
        $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + playerArray[playerIndex].name + '</div>');
    });
});
$(文档).ready(函数(){
var playerArray=[];
var playerIndex=0;
函数播放器(名称){
this.name=名称;
得分=0;
};
var addPlayer=函数(名称){
playerArray[playerIndex]=新玩家(姓名);
playerIndex++;
};
$('add#u players')。在('click','btn add',函数()上{
var toAdd=$('input[name=playerNameInput]')。val();
addPlayer(toAdd);
$('#playerList').append(''+playerray[playerIndex].name+'');
});
});
我在网站上搜索过其他类似的问题,但它们都是关于API或与我无关的问题。我将非常感谢任何帮助

看看这个代码

var addPlayer = function(name){
     playerArray[playerIndex] = new player(name);  //you store it at an index
     playerIndex++;  //you increment
 };
因为索引是递增的,并且没有任何东西像您正在读取的位置

console.log(playerArray[playerIndex]);  //undefined
console.log(playerArray[playerIndex-1]);  //the last entry you added

就我个人而言,我不会依赖最后一个索引。我会在你创建新玩家时返回它。没有必要处理索引问题

var playerArray = [];
var playerIndex = 0;

function Player (name) {
    this.name = name;
    score = 0;  //this will be a problem....
};
var addPlayer = function(name){
    var user = new Player(name);
    playerArray.push(user);
    return user;
};

$('#add_players').on('click', '#btn-add', function(){
    var toAdd = $('input[name=playerNameInput]').val();
    var person = addPlayer(toAdd);
    $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + person.name + '</div>');
});
var playerray=[];
var playerIndex=0;
函数播放器(名称){
this.name=名称;
score=0;//这将是一个问题。。。。
};
var addPlayer=函数(名称){
var user=新玩家(名称);
playerary.push(用户);
返回用户;
};
$('add#u players')。在('click','btn add',函数()上{
var toAdd=$('input[name=playerNameInput]')。val();
var person=addPlayer(toAdd);
$(“#playerList”).append(“”+person.name+“”);
});

另外,
score
也将是一个问题

第一次运行是将1添加到初始化为0的
playerIndex

当您第一次到达
playerArray[playerIndex].name
时,
playerIndex
为1,您正在查找第一个值(索引0)。您将始终落后一个索引。

addPlayer()
在将对象添加到
playerArray
后,将增加
playerIndex
计数器,然后在
单击
处理程序中使用该计数器。根据您的代码,当您调用
playerArray[playerIndex]
(添加的最后一个元素?)时,不清楚您试图检索什么,但我只想去掉计数器并使用:

$(文档).ready(函数(){
var playerArray=[];
函数播放器(名称){
this.name=名称;
得分=0;
}
var addPlayer=函数(名称){
playerary.push(新玩家(名称));
};
$('add#u players')。在('click','btn add',函数()上{
var toAdd=$('input[name=playerNameInput]')。val();
addPlayer(toAdd);
//playerArray[playerArray.length-1]将始终检索数组中的最后一个元素
//如果始终需要第一个,请使用playerArray[0]
$(“#playerList”).append(“”+playerray[playerray.length-1].name+“”);
});
});

你能帮我理解为什么有人会否决我们的答案吗?你做这件事的时间比我长。我们俩同时发布了(正确的)答案。那些反对票把我弄糊涂了。在任何情况下,我都会将你的投票提高,以补偿你错误的否决票。鉴于他/她在JS方面的经验水平,OP可能会从解释“
score
将成为一个问题”中获益。我感谢你的回答。这很有帮助。我想知道为什么你认为
score
会成为一个问题,因为它是一个随机的全局变量,没有附加任何东西。我认为它属于玩家对象的范围。你刚刚从数组中删除了玩家。读取值时,pop()不是正确的用法。推就可以了。
$(document).ready(function(){
    var playerArray = [];

    function player (name) {
        this.name = name;
        score = 0;
    }

    var addPlayer = function(name){
        playerArray.push(new player(name));
    };

    $('#add_players').on('click', '#btn-add', function(){
        var toAdd = $('input[name=playerNameInput]').val();
        addPlayer(toAdd);

        // playerArray[playerArray.length - 1] will always retrieve the last element in the array
        // use playerArray[0] if you always want the first
        $('#playerList').append('<div class="ui-block-a" style="padding:1em">' + playerArray[playerArray.length - 1].name + '</div>');
    });
});