将原型附加到JavaScript对象

时间:2014-04-17 14:16:42

标签: javascript json prototype prototypal-inheritance

假设我有人物对象的以下JSON。

[
  {
     "name": "Alice",
     "age": 28,
  },
  {
     "name": "Bob",
     "age": 33
  }
]

如果我解析这个,我会得到一个包含两个JavaScript对象的数组。 让我们说,我想用这个名为introduction的方法装备这两个对象,就像这样做

function introduce() {
  return "My name is " + this.name + " and I am " + this.age + " years old.";
}

现在,我可以迭代我的两个人并致电

person.constructor.prototype.introduce = introduce

但是,这将在所有JavaScript对象中公开介绍函数,而不仅仅是上面的两个。

我也可以手动将函数附加到每个对象,但如果我想用其他函数扩展我的人员,我将不得不再次遍历所有人。

理想情况下,我想要一个原型,我可以使用introduce方法,然后将这个原型附加到我的所有人身上,所以如果我稍后扩展原型,我的员工也将获得额外的功能。 / p>

问题是:如何?

7 个答案:

答案 0 :(得分:3)

您可以使用已弃用的 __proto__属性或ES6方法Object.setPrototypeOf。请注意,强烈劝阻来改变对象的原型(c.f。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto),但它似乎是一个合法的用例。

var you = { name: "Niels B." }
you.__proto__ = { hello: function () { console.log(this.name) } }
you.hello()

所以针对您的具体问题:

function Person() {}
Person.prototype = {
  introduce: function () {
    return "My name is " + this.name + " and I am " + this.age + " years old.";
  }
}

然后为每个人:

person.__proto__ = Person.prototype;
// or
Object.setPrototypeOf(person, Person.prototype);

这是一个相关的JSPerf:http://jsperf.com/parse-json-into-an-object-and-assign-a-prototype

相关主题:https://groups.google.com/forum/#!topic/ringojs/PxS1O5jMx-8

答案 1 :(得分:3)

我建议你创建一个类:

JSBin

var Person = (function () {
    function Person(person) {
        this.person = person;
        this.name = person.name;
        this.age = person.age;
    }
    Person.prototype.introduce = function () {
        return "My name is " + this.name + " and I am " + this.age + " years old.";
    };
    return Person;
})();

答案 2 :(得分:3)

你的问题有点模糊不清楚。但我认为你不想要你的人#34;成为一个普通的对象,而是一个单独的人"类:"

var Person = function(obj){
    this.name = obj.name;
};

Person.prototype.introduce = function(){
  return console.log('hi, I\'m '+this.name);
};

var personA = new Person({ name:'a' });
var personB = new Person({ name:'b' });

personA.introduce();  // "hi, I'm a"
personB.introduce();  // "hi, I'm b"

答案 3 :(得分:3)

制作一个简单的Person课程:

function Person(name,age){
    this.name = name; 
    this.age = age
}

说,你有这个数组:

var people = [
  {
     "name": "Alice",
     "age": 28,
  },
  {
     "name": "Bob",
     "age": 33
  }
];

people转换为Person数组:

people = people.map(function(p){
    return new Person(p.name,p.age)
});

将方法添加到原型:

Person.prototype.introduce = introduce

答案 4 :(得分:2)

创建一个人类并使用Person.prototype:

function Person(name, age){
    this.name = name;
    this.age= age;
}

function introduce() {
  return "My name is " + this.name + " and I am " + this.age + " years old.";
}

Person.prototype.introduce = introduce;

p1 = new Person ("bob", 33);
p1.introduce();

答案 5 :(得分:1)

我建议为这些人创建一个结构。

var Person = function Person(init){
 this.name = init.name;
 this.age = init.age;
};
Person.constructor = Person;

然后迭代建立人。

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

现在人们已经建成了,也许你想让他们能够自我介绍。您可以简单地扩展您的Person“class”(定义)。

Person.prototype.introduce = function() {
  return "My name is " + this.name + " and I am " + age + " years old.";
}

将允许他们使用此功能

for(var i = 0; i < people.length; i++){
 console.log(people[i].introduce());
}

答案 6 :(得分:1)

如果您不想每次尝试重新构建:

var people =[
  {
     "name": "Alice",
     "age": 28,
  },
  {
     "name": "Bob",
     "age": 33
  }
],
i=-1,len=people.length,tmp
,proto={
  sayName: function(){
    console.log("from sayname",this.data.name);
  }
};
while(++i<len){
  tmp=Object.create(proto);
  tmp.data=people[i];
  people[i]=tmp;
}
people[0].sayName();
proto.sayName=function(){console.log("changed it");};
people[1].sayName();

如果你的JSON对象有很多成员,那么这可以使你不必在构造函数中复制它们,但是我不确定你是否能从中获得更多的性能。