在javascript中将简单对象转换为函数实例(“类”)

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

服务器响应:

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

我从服务器获取Person数组。 我想要将genericsPerson数组转换为typesPerson数组。 所以我可以使用

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

我创build了Javascript的

  Object.create(Person,person1); 

但是我想用数组支持跨浏览器版本

  ObjectArray.create(Person,persons); 

要么

  Object.create(Person[],persons); 

在JavaScript中创build对象需要调用其构造函数。 所以,首先你需要find正确的参数,这可能并不总是属性。 之后,您可以将JSONparsing对象的所有公共属性重新分配给创build的实例。

一个通用的解决scheme是,每个构造函数都接受任何看起来像实例(包括实例)的对象并克隆它们。 所有创build正确实例所需的内部逻辑将位于正确的位置。

或者甚至比重载构造函数更好,可能是在你的类上创build一个静态方法,它接受对象并从中创build实例:

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

你的情况很简单,因为你没有任何参数,只有公共属性。 要将{personName:John,animals:[]}更改为对象实例,请使用以下命令:

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

你也可以使用Object.extendfunction,如果你有一个可用的(例如jQuery):

 var personInstance = $.extend(new Person(), personLiteral); 

Animal实例的创build是类似的。

由于JSON不会传输有关类的任何信息,因此您必须先了解结构。 在你的情况下,将是:

 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]); } } 

顺便说一句,你的run方法似乎可能被添加到Animal.prototype对象,而不是每个实例。

好像你有类有一些原型方法,你只是想让你的对象使用这些方法。 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(); }); 

如果每个人都支持__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(); });​ 

首先:在JavaScript中你没有类似C ++,Java或C#的类。 所以你不能真的有一个types的数组。

你在做什么基本上适用于variables,但不适用于函数。 所以你必须先添加函数。 看看下面的代码来获得一个想法。

 <script type="text/javascript"> function Person() { var self = this; self.personName=""; self.animals=[]; } function Animal(){ var self=this; self.animalName=""; self.run=function(meters){ 7/... do something } } var persons = [{personName:"John",animals:[{animalName:"cheetah"},{animalName:"giraffe"}]} , {personName:"Smith",animals:[{animalName:"cat"},{animalName:"dog"}]} ]; //use this to assign run-function var a = new Animal(); //assign run-function to received data persons[0].animals[0].run = a.run; //now this works persons[0].animals[0].run(); </script> 

如何在Person类上创buildStatic方法,它将接受你的服务器响应并创build所需的variables。

这只是一个想法。 请看看这是否符合你的问题。

 //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 );