当前位置: 首页 > 面试题库 >

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

景轶
2023-03-14
问题内容
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并不太熟悉,而且令人赞叹,因为我无法向使用ORM名称Sequelize.js从数据库中获取的对象添加新属性。 为了避免这种情况,我使用此技巧: 因此,通常如何向对象添加新属性。 如果有帮助,我使用sequelize-postgres版本2.0.x。 更新。 console.log(节点): 接下来,我想您会想到的是:“好吧,很简单,只需将您的属性添加到dataV

  • 我的普通数组对象是这样的: 我想把对象数组转换成这样: 似乎将使用关键字parent_id来分隔它 但我仍然对实现它感到困惑 如何像那样转换数组对象? 请帮帮我

  • 问题内容: 由于某种原因,我无法在MDN文档中找到这个简单的东西(也许我只是想念它)。 我希望这可以工作: …但是第一行抛出 如何从普通对象制作地图?我真的必须首先将其转换为键值对数组的数组吗? 问题答案: 是的,构造函数采用键值对数组。 是ES2017(19.1.2.5)中可用的新的Object静态方法。 如果您需要支持较旧的环境,并且不适合使用Transpilation,请使用polyfill

  • 问题内容: 我有一个猫鼬的文档,我想在JSON编码之前进行扩展并作为响应发送出去。如果我尝试向文档添加属性,则将其忽略。该属性不会出现无法进行正常扩展的情况。奇怪的是,它可以正常工作并返回具有所有正确属性的对象。有一个更好的方法吗? 问题答案: 猫鼬继承自s,后者有一个方法。我相信您要寻找的应该是的结果。 http://mongoosejs.com/docs/api.html#document_D

  • 问题内容: 转换的最佳方法是什么: 至: 问题答案: ECMAScript 6引入了易于填充的内容: 该方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 数组的自身属性不会被复制,因为它无法枚举。 另外,您可以使用ES6 传播语法来达到相同的结果:

  • 问题内容: 我正在尝试将数组转换为对象,并且我快到了。 这是我的输入数组: 这是我当前的输出对象: 这是我想要的输出对象: 这是我当前的代码: 问题答案: 你不能那样做。 不是有效的JavaScript对象。 javascript中的对象是键值对。看看你的情况如何,然后是冒号,然后是数字?的是,号码是的。 如果执行此操作,则将无法访问属性。 这是Firefox控制台的结果: