在javascript中将普通对象转换为函数实例("类")

ozz*_*ozz 14 javascript casting

function Person() {
      var self = this;

      self.personName="";
      self.animals=[];
}

function Animal(){
     var self=this;

     self.animalName="";
     self.run=function(meters){
         .....
     }
}
Run Code Online (Sandbox Code Playgroud)

服务器响应:

 [{personName:John,animals:[{animalName:cheetah},{animalName:giraffe}]} , {personName:Smith,animals:[{animalName:cat},{animalName:dog}]} ]
Run Code Online (Sandbox Code Playgroud)

我从服务器获取Person数组.我想将通用Person数组转换为类型Person数组.所以我可以使用

 persons[0].Animals[2].Run();
Run Code Online (Sandbox Code Playgroud)

我创建了Javascript

 Object.create(Person,person1);
Run Code Online (Sandbox Code Playgroud)

但我希望它的跨浏览器版本支持阵列

  ObjectArray.create(Person,persons);
Run Code Online (Sandbox Code Playgroud)

要么

 Object.create(Person[],persons);
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 16

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

一般的解决方案是每个构造函数都接受任何看起来像实例(包括实例)的对象并克隆它们.创建适当实例所需的所有内部逻辑将位于正确的位置.

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

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

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

var personLiteral = ... // JSON.parse("...");
var personInstance = new Person();
for (var prop in personLiteral)
    personInstance[prop] = personLiteral[prop];
Run Code Online (Sandbox Code Playgroud)

您还可以使用Object.assign功能(或例如jQuery.extendpre-ES6):

var personInstance = Object.assign(new Person(), personLiteral);
Run Code Online (Sandbox Code Playgroud)

Animal实例的创建类似.

由于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 Code Online (Sandbox Code Playgroud)

顺便说一下,您的run方法似乎可能会添加到Animal.prototype对象而不是每个实例上.