2015-01-08 2 views
4

Я пытаюсь научиться программировать. Я просмотрел список сайтов, посвященных учебникам, и я застрял в том, что, по-моему, для меня очень важно понять.Использование JSON для создания экземпляров объекта

Мои вопросы:

  1. (Это то, что я хотел бы самым понять) В моей для ... в цикле, почему создание новых «Obj» объекты с помощью «Контакты» конструктор работает? Кажется, мне понадобилось бы другое имя при каждом цикле, чтобы я не перезаписывал объект, который я создал ранее. Если это правильно, как мне это сделать, если я ничего не знаю о количестве или значении контактов раньше времени? Кроме того, почему заголовок любого из объектов в журналах консоли не говорит obj? Я запутался в том, что значит создать экземпляр объекта? Являются ли имена этих экземпляров несущественными?

  2. Почему все свойства не определены? Должны ли ссылки на свойства временной переменной «i» работать?

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

Большое спасибо за любую помощь, которую я могу получить от этого. Не сдерживай меня от того, чтобы сказать мне что-нибудь еще глупое, что я могу делать.

Вот ссылка на скриншот консоли - http://i.imgur.com/TK4dtfV.png

var TestApp = {}; 

// my data... taken from wherever 
TestApp.jsonContacts = { 
    contact1: { 
     name: "Ethan", 
     age: 24 
    }, 
    contact2: { 
     name: "Evan", 
     age: 30 
    }, 
    contact3: { 
     name: "Paul", 
     age: 9000 
    } 
}; 

// I know this is silly, just let me pretend... 
TestApp.jsonStrung = JSON.stringify(TestApp.jsonContacts); 

TestApp.globalContactList = []; 

// my constructor function to create instances of Contact 
TestApp.Contact = function(name, age){ 
    this.name = name; 
    this.age = age; 
    TestApp.globalContactList.push(this); 
}; 

// where I'm taking data and creating new Contact objects 
TestApp.instantiateObjects = function(){ 
    // I know this is silly, just let me pretend... 
    var jsonUnstrung = JSON.parse(TestApp.jsonStrung); 
    // I think I'm looping through the first set of objects sitting in jsonContacts 
    for (var i in jsonUnstrung) { 
     var obj = new TestApp.Contact(i.name, i.age); 
     console.log(obj); 
    } 
    console.log(TestApp.globalContactList); 
}; 

TestApp.instantiateObjects(); 

ответ

5

В моей для ... в цикле, почему создание новых «Obj» объекты с помощью «Контакты» Конструктор работает?

Переменная - это просто место для хранения ценности. Это не само значение. Если вы переписываете переменную с новым значением, предыдущее значение, которое оно удерживает, будет продолжать существовать до тех пор, пока что-то держит ссылку на него; это просто, что переменная больше не будет ссылаться на нее.

Кажется, мне понадобилось бы другое имя при каждом цикле, чтобы я не перезаписывал объект, который я создал ранее.

Нет, вы этого не сделаете. Одна переменная прекрасна, если вы do что-то со значением, прежде чем назначать переменную на следующее значение.

Если это правильно, как это сделать, если я ничего не знаю о количестве или значении контактов раньше времени?

Неважно, сколько у вас есть.

Кроме того, почему заголовок любого из объектов в журналах консоли не говорит obj?

console.log() распечатывает переданное ему значение. Он не заботится (не знает) о переменной , которую вы передаете ей.

Я запутался в том, что значит создать экземпляр объекта?

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

Являются ли имена этих экземпляров несущественными?

Да, экземпляры объектов не имеют имен.

Почему все свойства не определены?

i хранит имена свойств объекта вы перебор, так что в этом случае строки "contact1", "contact2", "contact3". Эти строки не имеют свойства name или age, поэтому ваш конструктор получает два значения undefined.

Следует ли ссылаться на свойства временной переменной «i»?

Вы должны использовать i в качестве имени свойства для доступа к значениям свойств:

var obj = new TestApp.Contact(jsonUnstrung[i].name, jsonUnstrung[i].age); 



В общем, это хорошая идея, чтобы не иметь побочные эффекты, такие как TestApp.globalContactList.push(this); в конструкторе. Могут быть случаи, когда это имеет смысл, но большую часть времени удалять эту линию и делать это было бы предпочтительнее:

for (var i in jsonUnstrung) { 
    var contact = jsonUnstrung[i]; 
    var obj = new TestApp.Contact(contact.name, contact.age); 
    console.log(obj); 
    TestApp.globalContactList.push(obj); 
} 
+0

Большое спасибо за это. Он прояснился. –

+0

Хорошо ... Что ДОЛЖНО делать с объектами после того, как я их создал? Вероятно, есть несколько способов справиться с этим, но, учитывая, что я просто хочу изучить довольно надежный способ сделать это в будущем, что бы вы порекомендовали? Должен ли я действительно подталкивать их к массиву? Меня беспокоит только то, что у меня нет способа узнать, какой объект в массиве я упоминаю в будущем. Как бы вы рекомендовали отслеживать номера индексов и объект, который они ссылаются полезным образом? Или есть ли другой способ ссылаться на эти объекты, созданные мной, чтобы я мог позволить событиям DOM изменять данные? –

+1

@ noob-in-need Извините за поздний ответ. То, что вы должны делать с объектами, полностью зависит от того, что вы пытаетесь сделать. Без конкретной задачи я не думаю, что есть какой-то способ сказать, что ваш код должен делать дальше того, что он уже делает. Если у вас есть определенный сценарий в виду, что вы хотели бы знать, как подойти, вы можете опубликовать новый вопрос на этом сайте, и многие люди будут рады помочь вам. – JLRishe