ein Objekt in JavaScript zu erstellen, müssen Sie den Aufruf der Konstruktor . Also, zuerst müssen Sie die richtigen Argumente finden, die nicht immer nur Eigenschaften sind. Danach können Sie alle öffentlichen Eigenschaften des JSON-analysierten Objekts den erstellten Instanzen neu zuweisen.
Eine allgemeine Lösung wäre, dass jeder Konstruktor alle Objekte akzeptiert, die wie Instanzen aussehen (einschließlich echter Instanzen) und sie klont. Die gesamte interne Logik, die zum Erstellen der richtigen Instanzen benötigt wird, befindet sich dann an der richtigen Stelle.
Oder noch besser als der Konstruktor Überlastung könnte sein, eine statische Methode auf Ihre Klasse zu erstellen, die Objekte und erzeugt Instanzen von ihnen nimmt:
Person.fromJSON = function(obj) {
// custom code, as appropriate for Person instances
// might invoke `new Person`
return …;
};
Ihr Fall ist sehr einfach, wie Sie don‘ t haben irgendwelche Argumente und nur öffentliche Eigenschaften.Um {personName:John,animals:[]}
auf eine Objektinstanz zu ändern, verwenden diese:
var personLiteral = ... // JSON.parse("...");
var personInstance = new Person();
for (var prop in personLiteral)
personInstance[prop] = personLiteral[prop];
Sie auch Object.extend
Funktionalität für diese verwenden können, sollten Sie zur Hand haben (zB jQuery):
var personInstance = $.extend(new Person(), personLiteral);
Die Erstellung der Animal
Instanzen funktioniert analog.
Da JSON keine Informationen über die Klassen transportiert, müssen Sie die Struktur vorher kennen. In Ihrem Fall wird es sein:
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, scheint Ihre run
Methoden wahrscheinlich auf dem Animal.prototype
Objekt hinzugefügt werden, anstatt jede Instanz.
Ihre Frage ist unklar. JavaScript-Arrays sind nicht typisiert. (Nun, es gibt neue Array-ähnliche Dinge, die eingegeben werden, aber grundlegende Arrays sind nicht.) – Pointy
Der Code, den Sie sagen möchten, impliziert, dass das Person-Array, das Sie vom Server abrufen, Objekte enthält, z. '[{Tier: [...]}, {Tier: [...]}] - meinst du das? – JMM
Ich habe Beispielcode hinzugefügt. Ich denke, die Frage ist jetzt klar. – ozz