如何在javascript中将文字对象转换为用户定义的对象?
在编写大量利用JSON/AJAX的web应用程序时,我发现自己返回了大量的文字javascript对象(JSON)。例如,我可能从GetCats.asp请求所有猫。它将返回: [ { 'id': 0, 'name': 'Persian' }, { 'id': 1, 'name': 'Calico' }, { 'id': 2, 'name': 'Tabby' } ] [ {'id':0,'name':'posian'}, {'id':1,'name':'Calico'}, {'id':2,'name':'Tabby'} ] 现在,这些都是具有行为的Cat对象。但是,如果我定义一个Cat对象,即函数Cat(){},我知道没有有效的方法可以将这些文本对象引导到用户定义对象的行为中如何在javascript中将文字对象转换为用户定义的对象?,javascript,ajax,json,Javascript,Ajax,Json,在编写大量利用JSON/AJAX的web应用程序时,我发现自己返回了大量的文字javascript对象(JSON)。例如,我可能从GetCats.asp请求所有猫。它将返回: [ { 'id': 0, 'name': 'Persian' }, { 'id': 1, 'name': 'Calico' }, { 'id': 2, 'name': 'Tabby' } ] [ {'id':0,'name':'posian'}, {'id':1,'name':'Calico'}, {'id':
我可以通过遍历它们并分配函数的蛮力来做到这一点,但这并不漂亮。有没有一种好的、一行(或几行)的方法可以将这种行为“投射”到这些文字对象上?无法回避这样一个事实,即您必须迭代所有简单对象,并将它们更改为不同类型的对象。你无法避免这个循环。也就是说,您可以创建一个构造函数,它接受这样一个简单的对象,并将这些值复制到新实例中 像这样:
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"
功能类别(c){
this.id=c.id;
this.name=c.name;
}
Cat.prototype.meow=函数(){alert('meow');}
Cat.prototype.displayName=函数(){alert(this.name);}
变量猫=[
{'id':0,'name':'posian'},
{'id':1,'name':'Calico'},
{'id':2,'name':'Tabby'}
];
对于(i=0,len=cats.length;i为每个对象分配一个适当的原型:
var list = [
{ 'id': 0, 'name': 'Persian' },
{ 'id': 1, 'name': 'Calico' },
{ 'id': 2, 'name': 'Tabby' }
];
for (obj in list)
{
obj.prototype = new Cat();
}
如果正在使用(或另一个具有兼容接口的),只需提供一个回调以将原始对象替换为自定义对象:
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);
}
你使用原型框架吗?如果是,这里是一个例子
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
而Object.extend与property相同,它通过属性向newObject添加属性来扩展@Benry的答案
我发现有一个extend函数将一个对象的属性复制到另一个对象上是很重要的。将它复制到对象上有一个半传统;object.extend()
存在于许多较小的库中(注意:这与object.prototype不同)
另外,在编写代码时,您可以使用可读的文字符号:
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"
var猫=[
{'id':0,'name':'posian'},
{'id':1,'name':'Calico'},
{'id':2,'name':'Tabby'}
];
对于(i=0,len=cats.length;iJavascript没有类,它使用基于原型的继承。这不会因为不同的原因而起作用-这些对象是符号对象,而不是可以实例化的第一类对象-它们实际上是javascript中的函数。好吧,那个黑客David Flanagan称它们为类。我会继续支持他。但如果我们真的很挑剔,让我们称它们为构造函数。据我所知,这适用于obj.\uuuuu proto\uuuuu,并且只适用于Javascript(而不是Jscript/IE)。
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"