在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数组。我想将通用的Person数组转换为输入的Person数组。所以我可以用

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

我创立了Javascript

 Object.create(Person,person1);

但是我想要带有数组支持的跨浏览器版本

  ObjectArray.create(Person,persons);

要么

 Object.create(Person[],persons);

回答:

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

一个通用的解决方案是,每个构造函数都接受看起来像实例(包括真实实例)的任何对象并对其进行克隆。然后,将创建正确实例所需的所有内部逻辑放在正确的位置。

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

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.assign功能(例如jQuery.extendES6之前的版本):

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

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方法似乎可能会添加到Animal.prototype对象上,而不是每个实例上。

以上是 在javascript中将普通对象转换为函数实例(“类”) 的全部内容, 来源链接: utcz.com/qa/416591.html

回到顶部