利用JSON / AJAX编写大量Web应用程序,我发现自己返回了很多文字javascript对象(JSON)。例如,我可能会从GetCats.asp请求所有Cats。它会回来:
[ { 'id': 0, 'name': 'Persian' }, { 'id': 1, 'name': 'Calico' }, { 'id': 2, 'name': 'Tabby' } ]
现在,这些都是具有行为的Cat对象。但是,如果我定义一个Cat对象,函数Cat(){},我知道没有高效的方法将这些文字对象引入用户定义对象的行为。
我可以通过迭代它们并分配函数的蛮力来做到这一点,但它不会很漂亮。是否有一个很好的,一行(或几个)的方式以某种方式将这种行为“转换”到这些文字对象上?
答案 0 :(得分:2)
您无需绕过所有简单对象并将其更改为其他类型的对象。你无法避免循环。也就是说你可以创建一个构造函数来获取这样一个简单的对象,并将这些值复制到新实例中。
像这样:
function Cat(c) {
this.id = c.id;
this.name = c.name;
}
Cat.prototype.meow = function() {alert('meow');}
Cat.prototype.displayName= function() {alert(this.name);}
var cats = [
{ 'id': 0, 'name': 'Persian' },
{ 'id': 1, 'name': 'Calico' },
{ 'id': 2, 'name': 'Tabby' }
];
for (i=0,len=cats.length; i<len; i++) {
cats[i] = new Cat(cats[i]);
}
cats[0].meow(); // displays "meow"
cats[0].displayName(); // display "Persian"
答案 1 :(得分:0)
如果你正在使用json2 parser(或另一个具有兼容接口的),你可以简单地提供一个回调来用自定义对象替换原始对象:
var catSource = '[ { "id": 0, "name": "Persian" }, { "id": 1, "name": "Calico" }, { "id": 2, "name": "Tabby" } ]';
function Cat(id, name)
{
this.id = id;
this.name = name;
}
Cat.prototype =
{
toString: function()
{
return this.name;
}
};
function doStuff()
{
var cats = JSON.parse(catSource, function(key, val)
{
// some expression to detect the type of val
if ( val.id !== undefined && val.name !== undefined )
return new Cat(val.id, val.name);
return val;
});
alert(cats);
}
答案 2 :(得分:0)
var cats = [
{id: 15, name: 'Tables', count:45 },
{id: 23, name: 'Chairs', count:34 }
];
var catsObjects = [];
cats.each(function(item){
var newObject = new Cat();
Object.extend(newObject, item);
catsObjects.push(newObject);
});
基本上,Array.each函数与“for i&lt; Array.length”相同 和Object.extend与添加属性到newObject
的逐个属性相同答案 3 :(得分:0)
延长@Benry的答案。
我发现有一个扩展功能可以将一个对象的属性复制到另一个对象上。将它放在Object上有一种半传统; Object.extend()
存在于许多较小的库中(注意:这与Object.prototype不同)。
Object.extend = function ( take, give ) {
for (var k in give) {
if (give.hasOwnProperty(k)) {
take[k] = give[k];
}
}
return take;
}
在编写代码时,您可以使用可读的文字表示法:
function Cat (c) {
Object.extend( this, ( c || this.defaults ) );
}
Object.extend(Cat.prototype, {
meow : function() {
alert( 'Meow, my name is ' + this.name );
},
defaults : {
name : 'I have no name',
id : null
}
});
然后你可以很简单地创建你的猫队:
var cats = [
{ 'id': 0, 'name': 'Persian' },
{ 'id': 1, 'name': 'Calico' },
{ 'id': 2, 'name': 'Tabby' }
];
for (i=0,len=cats.length; i<len; i++) {
cats[i] = new Cat( cats[i] );
}
cats[0].meow(); // displays "meow, my name is Persian"
答案 4 :(得分:-2)
为每个对象分配一个合适的原型:
var list = [
{ 'id': 0, 'name': 'Persian' },
{ 'id': 1, 'name': 'Calico' },
{ 'id': 2, 'name': 'Tabby' }
];
for (obj in list)
{
obj.prototype = new Cat();
}