假设我有人物对象的以下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>
问题是:如何?
答案 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)
我建议你创建一个类:
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对象有很多成员,那么这可以使你不必在构造函数中复制它们,但是我不确定你是否能从中获得更多的性能。