2015-04-30 2 views
0

Я делаю небольшую программу для себя в видеоигре. Проблема в том, что он читает определенные объекты, которые не определены, когда он говорит об ошибках на странице.JavaScript Объект не определен

$(document).ready(function(){ 
     //A roster for all character choices. 
     var roster = { 
      Riven:{name: "Riven", rival: Jax, rival2: Pantheon}, 
      Pantheon:{name: "Pantheon", rival: Olaf, rival2: Darius}, 
      Veigar:{name: "Veigar", rival: Akali, rival2: Fizz}, 
      Olaf:{name: "Olaf", rival: Kayle, rival2: Kennen}, 
      Jax:{name: "Jax", rival: Malphite, rival2: Pantheon}, 
      Akali:{name: "Akali", rival: Garen, rival2: LeeSin}, 
      Malphite:{}, 
      Darius:{}, 
      LeeSin:{}, 
      Garen:{}, 
      Kayle:{}, 
      Fizz:{}, 
     }; 

Он говорит, объект Дарий не определен в объекте Пантеона или в любое время я ссылаться Дарий после этого блока кода. Тем не менее, Олаф, Акали и любой, у кого был полный список свойств объекта, определены. Я попытался поместить эти свойства в объекты, которые считаются не определенными, но это не работает. Я новичок в JavaScript, и я понятия не имею, что делать. Если это актуально, я вызываю библиотеку jQuery в скрипте непосредственно перед этим в своем HTML-коде.

+1

Возможно, вы не закрываете функцию готовности документа}). – stanze

+2

Ключи свойств объекта не являются переменными. Вы можете создавать произвольно именованные свойства в любое время, но вы не можете использовать это имя свойства как переменную так, как вы делаете в своих вложенных объектах – charlietfl

+0

всего лишь небольшая точка - почему Джакс не один из соперников Пантеона? –

ответ

0

Как @charlietfl упоминает в комментарии, вы не указали переменную с именем Jax. После определения roster вы можете ссылаться на roster.Jax, но вы не можете ссылаться на него до того, как вы закончите определение объекта, потому что до тех пор roster все еще не определено.

Вы должны будете сделать это:

var roster = { 
     Riven:{name: "Riven"}, 
     Pantheon:{name: "Pantheon"}, 
     Veigar:{name: "Veigar"}, 
     Olaf:{name: "Olaf"}, 
     Jax:{name: "Jax"}, 
     Akali:{name: "Akali"}, 
     Malphite:{}, 
     Darius:{}, 
     LeeSin:{}, 
     Garen:{}, 
     Kayle:{}, 
     Fizz:{}, 
    }; 

А затем назначить соперников, как это:

roster.Riven.rival = roster.Jax; 

Это будет беспорядок, поэтому я хотел бы начать с массивом как следующие. (Обратите внимание, как rival и rival2 свойства только имена (строки) в этой точке.)

var characters = [ 
    { name: 'Riven', rival: 'Jax', rival2: 'Pantheon' }, 
    { name: 'Pantheon', rival: 'Olaf', rival2: 'Darius' }, 
    { name: 'Veigar', rival: 'Akali', rival2: 'Fizz' }, 
    { name: 'Olaf', rival: 'Kayle', rival2: 'Kennen' }, 
    { name: 'Jax', rival: 'Malphite', rival2: 'Pantheon' }, 
    { name: 'Akali', rival: 'Garen', rival2: 'LeeSin' }, 
    { name: 'Malphite' }, 
    { name: 'Darius' }, 
    { name: 'LeeSin' }, 
    { name: 'Garen' }, 
    { name: 'Kayle' }, 
    { name: 'Fizz' } 
]; 

Вы можете создать объект реестра из массива, выполнив следующие действия. (В rival и rival2 свойства до сих пор только имена (строки) в этой точке.)

var roster = {}; 
characters.forEach(function(character) { 
    roster[character.name] = character; 
}); 

Если вы действительно хотите, чтобы rival и rival2 свойства быть ссылки на объекты, а не просто имена, вы можете конвертировать их следующий код.

characters.forEach(function(character) { 
    character.rival = roster[character.rival]; 
    character.rival2 = roster[character.rival2]; 
}); 

И если вы хотите поддерживать более двух соперников: jsfiddle

0

может быть, если вы разделяете заявление вашего объекта:

// here is an empty or a default setting, just to avoid 
// an undefined exception 
var roster = { 
      Malphite:{}, 
      Darius:{}, 
      LeeSin:{}, 
      Garen:{}, 
      Kayle:{}, 
      Fizz:{}, 
     }; 

, а затем другие свойства:

// here's the real declaration 
roster = { 
      Riven:{name: "Riven", rival: roster.Jax, rival2: roster.Pantheon}, 
      Pantheon:{name: "Pantheon", rival: roster.Olaf, rival2: roster.Darius}, 
      Veigar:{name: "Veigar", rival: roster.Akali, rival2: roster.Fizz}, 
      Olaf:{name: "Olaf", rival: roster.Kayle, rival2: roster.Kennen}, 
      Jax:{name: "Jax", rival: roster.Malphite, rival2: roster.Pantheon}, 
      Akali:{name: "Akali", rival: roster.Garen, rival2: roster.LeeSin}, 
      Malphite:{}, 
      Darius:{}, 
      LeeSin:{}, 
      Garen:{}, 
      Kayle:{}, 
      Fizz:{}, 
     }; 

обратите внимание на префикс roster. перед тем, как перейти к объекту

Смежные вопросы