Casting objects simples para instâncias de function (“classs”) em javascript

function Person() { var self = this; self.personName=""; self.animals=[]; } function Animal(){ var self=this; self.animalName=""; self.run=function(meters){ ..... } } 

Resposta do servidor:

  [{personName:John,animals:[{animalName:cheetah},{animalName:giraffe}]} , {personName:Smith,animals:[{animalName:cat},{animalName:dog}]} ] 

Estou recebendo o array Person do servidor. Eu quero converter matriz de pessoa genérica para a matriz de pessoa digitada. Então eu posso usar

  persons[0].Animals[2].Run(); 

Eu fundei o Javascript

  Object.create(Person,person1); 

Mas eu quero uma versão cross-browser com suporte a array

  ObjectArray.create(Person,persons); 

ou

  Object.create(Person[],persons); 

Criar um object em JavaScript requer a invocação de seu construtor. Então, a princípio, você precisará encontrar os argumentos corretos, que nem sempre são apenas propriedades. Depois disso, você poderá reatribuir todas as propriedades públicas do object analisado por JSON às instâncias criadas.

Uma solução geral seria que todo construtor aceita quaisquer objects que se pareçam com instâncias (incluindo instâncias reais) e os clone. Toda a lógica interna necessária para criar instâncias adequadas será localizada no lugar certo.

Ou, ainda melhor do que sobrecarregar o construtor, pode ser criar um método estático em sua class que receba objects e crie instâncias deles:

 Person.fromJSON = function(obj) { // custom code, as appropriate for Person instances // might invoke `new Person` return …; }; 

Seu caso é muito simples, pois você não tem argumentos e apenas propriedades públicas. Para alterar {personName:John,animals:[]} para uma instância de object, use isto:

 var personLiteral = ... // JSON.parse("..."); var personInstance = new Person(); for (var prop in personLiteral) personInstance[prop] = personLiteral[prop]; 

Você também pode usar a funcionalidade Object.assign (ou, por exemplo, jQuery.extend pré-ES6) para isso:

 var personInstance = Object.assign(new Person(), personLiteral); 

A criação das instâncias Animal funciona de maneira análoga.

Como o JSON não transporta nenhuma informação sobre as classs, você deve conhecer a estrutura antes. No seu caso será:

 var persons = JSON.parse(serverResponse); for (var i=0; i 

Btw, seus methods de run provavelmente serão adicionados ao object Animal.prototype vez de a cada instância.

Parece que você tem classs que possuem alguns methods de protótipos e você gostaria apenas de poder fazer com que seus objects usem esses methods. http://jsfiddle.net/6CrQL/3/

 function Person() {} Person.prototype.speak = function() { console.log("I am " + this.personName); }; Person.prototype.runAnimals = function() { this.animals.each(function(animal){ animal.run(); }) }; function Animal() {} Animal.prototype.run = function() { console.log("My Animal " + this.animalName+ " is running"); } var untypedPersons = [{personName:"John",animals:[{animalName:"cheetah"},{animalName:"giraffe"}]} , {personName:"Smith",animals:[{animalName:"cat"},{animalName:"dog"}]} ]; function fromArray(arr, constructor) { return arr.map(function(obj){ var typed = Object.create(constructor.prototype); // Now copy properties from the given object for (var prop in obj) { typed[prop] = obj[prop]; } return typed; }); } var persons = fromArray(untypedPersons, Person); // Attach prototype to each animals list in person persons.each(function(person){ person.animals = fromArray(person.animals, Animal); }); persons.each(function(person){ person.speak(); person.runAnimals(); }); 

Isso tudo poderia ser muito mais fácil (e poderíamos evitar toda a cópia) se todos suportassem a propriedade __proto__ http://jsfiddle.net/6CrQL/2/

 persons.each(function(person){ person.__proto__ = Person.prototype; person.animals.each(function(animal){ animal.__proto__ = Animal.prototype; }); }); persons.each(function(person){ person.speak(); person.runAnimals(); });​ 

Primeiro de tudo: em JavaScript você não tem classs como em C ++, Java ou C #. Então você não pode realmente ter uma matriz digitada.

O que você está fazendo basicamente deve funcionar para variables, mas não para funções. Então você teria que adicionar as funções primeiro. Dê uma olhada no código a seguir para ter uma ideia.

  

Que tal criar um método estático na class Person, que aceitará sua resposta do servidor e criará as variables ​​necessárias.

Isto é apenas uma idéia. Por favor, veja se isso se encheckbox no seu problema.

 //Static method Person.createObjects = function( response ) { var persons = []; for ( var p = 0; p < response.length; p++ ) { //Create Person var person = new Person( response[p].personName ); //Create Animals for ( var a = 0; a < response[p].animals.length; a++ ) { var animal = new Animal( response[p].animals[a].animalName ); //Push this animal into Person person.animals.push ( animal ); } //Push this person in persons persons.push ( person ); } //Return persons return persons; } //Now Create required persons by passing the server response var persons = Person.createObjects ( response );