如何在javascript中将文字对象转换为用户定义的对象?

时间:2008-11-24 23:43:52

标签: javascript ajax json

利用JSON / AJAX编写大量Web应用程序,我发现自己返回了很多文字javascript对象(JSON)。例如,我可能会从GetCats.asp请求所有Cats。它会回来:

[
  { 'id': 0, 'name': 'Persian' },
  { 'id': 1, 'name': 'Calico' },
  { 'id': 2, 'name': 'Tabby' }
]

现在,这些都是具有行为的Cat对象。但是,如果我定义一个Cat对象,函数Cat(){},我知道没有高效的方法将这些文字对象引入用户定义对象的行为。

我可以通过迭代它们并分配函数的蛮力来做到这一点,但它不会很漂亮。是否有一个很好的,一行(或几个)的方式以某种方式将这种行为“转换”到这些文字对象上?

5 个答案:

答案 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();
}