添加protos但保持对象结构,javascript

时间:2015-09-05 15:06:10

标签: javascript prototype

假设我从API中获取此信息:

var _persons = [
  {
    name: 'John'
  },
  {
    name: 'Sarah'
  }
];

现在我想添加一个问候语功能。我想保存memoryspace,所以我创建了一个Person 'class'并将该函数添加为原型。

function Person(person){
  this.person = person;
}

Person.prototype.greeting = function(){
  return 'hello ' + this.person.name
};

我实例化每个人:

var persons = [];
function createPersons(people){
  for(var i = 0;i<people.length;i++){
    var person = new Person(people[i]);
    persons.push(person);
  }
};

createPersons(_persons);

问题是:

console.log(persons[0].name) //undefined
console.log(persons[0].person.name) //'John'

无论如何我可以让第一个console.log工作吗?

https://jsbin.com/zoqeyenopi/edit?js,console

4 个答案:

答案 0 :(得分:0)

遍历对象参数中的所有键,并将它们分配给this

function Person(person){
    for (var key in person) {
      this[key] = person[key];
    }
}

答案 1 :(得分:0)

var persons = [];
function createPersons(people){
  for(var i = 0;i<people.length;i++){
    var person = new Person(people[i]);
    persons.push(person);
  }
};

createPersons(_persons);

应该将人们用作变量

答案 2 :(得分:0)

要避免在对象中出现.person,您需要将源普通对象的每个属性直接复制到Person对象中:

function Person(p) {
    this.name = p.name;
    ...
}

[如果有大量按键,则使用循环]

然后,您在命名参数和您在createPersons函数中迭代的变量之间存在不匹配。此外,将该函数return放在列表中更有意义,而不是设置外部范围的变量:

function createPersons(people) {
    return people.map(function(p) {
        return new Person(p);
    });
}

var persons = createPersons(_persons);

注意:以上使用Array.prototype.map,它是通过回调从源数组生成新数组的规范函数。

答案 3 :(得分:0)

您正在创建一个赋予变量Person的{​​{1}}对象。您需要通过替换

来更改您获得的值
person

var person = new Person(people[i]);

var person = new Person(people[i]).person;