Creazione di un oggetto in JavaScript richiede l'invocazione del suo costruttore . Quindi, all'inizio dovrai trovare gli argomenti corretti, che potrebbero non essere sempre solo proprietà. Successivamente, è possibile riassegnare tutte le proprietà pubbliche dall'oggetto analizzato da JSON alle istanze create.
Una soluzione generale sarebbe che ogni costruttore accetta qualsiasi oggetto che assomigli a istanze (incluse istanze reali) e li clona. Tutta la logica interna necessaria per creare istanze appropriate verrà quindi posizionata nel posto giusto.
O anche meglio di sovraccaricare il costruttore potrebbe essere quello di creare un metodo statico sulla classe che prende gli oggetti e crea istanze da loro:
Person.fromJSON = function(obj) {
// custom code, as appropriate for Person instances
// might invoke `new Person`
return …;
};
Il tuo caso è molto semplice, come si don' t avere argomenti e solo proprietà pubbliche.Per cambiare {personName:John,animals:[]}
a un'istanza di un oggetto, utilizzare questo:
var personLiteral = ... // JSON.parse("...");
var personInstance = new Person();
for (var prop in personLiteral)
personInstance[prop] = personLiteral[prop];
È anche possibile utilizzare Object.extend
funzionalità per questo, se avete uno a disposizione (ad esempio jQuery):
var personInstance = $.extend(new Person(), personLiteral);
La creazione delle Animal
casi funziona in modo analogo
Poiché JSON non trasferisce alcuna informazione sulle classi, è necessario conoscere la struttura in precedenza. Nel tuo caso sarà:
var persons = JSON.parse(serverResponse);
for (var i=0; i<persons.length; i++) {
persons[i] = $.extend(new Person, persons[i]);
for (var j=0; j<persons[i].animals; j++) {
persons[i].animals[j] = $.extend(new Animal, persons[i].animals[j]);
}
}
Btw, i vostri metodi run
sembra probabile essere aggiunto sulla Animal.prototype
oggetto invece di ogni istanza.
La tua domanda non è chiara. Gli array JavaScript non sono stati digitati. (Bene, ci sono nuovi elementi simili a una matrice che sono stati digitati ma gli array di base non lo sono.) – Pointy
Il codice che dici di voler utilizzare implica che l'array Persona che stai recuperando dal server conterrà oggetti, ad es. '[{Animal: [...]}, {Animal: [...]}]' - è questo che intendi? – JMM
Ho aggiunto codice di esempio. Penso che la domanda sia chiara ora. – ozz