5

我有一堆从特定格式的 ajax 调用返回的 JSON 字符串,当开始将它们全部转换为我自己的 Javascript 对象时,我开始想知道是否有更简单的方法,因为我们在这里谈论的是 Javascript。

我将拥有var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; 并且我想轻松地将这些对象中的每一个与我的函数相关联,以便我可以执行以下操作:

myClass.prototype.doSomething = function() {
  // do something to this.name
};

$.each(manyOfThem, function(index, item) {
  item.doSomething();
});

我想我担心的是,我不想(因为它重复)这样做:

var myClass = function(item) {
  this.name = item.name;
  // do the same for the rest of item's potentially 20 properties
};

var oneOfThem = new myClass(manyOfThem[0]); // I think this is redundant....
oneOfThem.doSomething();

无论如何,如果还有(安全?)原因,我只需要把它吸起来并手动完成它们,请分享,谢谢!

4

3 回答 3

3

你的意思是,像(见jsfiddle):

var MyClass = function() {};
MyClass.prototype = {
    doSomething: function() {
        alert(this.name);
    }
};

然后

var manyObj = $.map(manyOfThem, function(obj) {
   return $.extend( new MyClass(), obj );
});

所以你可以打电话:

manyObj[0].doSomething();  // alert("a")

但是,这种方法不会保留与manyOfThem对象的直接副本。(在上面的示例中,更改manyOfThem[0].name = "foo";不会影响manyObj[0]并且调用manyObj[0].doSomething();仍将 alert "a"。要保留对对象的直接引用,请执行以下操作:

var manyObj = $.map(manyOfThem, function(obj) {
    function F() {};
    F.constructor = MyClass;
    F.prototype = obj;
    $.extend(F.prototype, new MyClass());
    return new F();
});


manyObj[0].doSomething();  // alert("a")

manyOfThem[0].name = "foo";  // modify the referenced object

manyObj[0].doSomething();  // alert("foo") ..also modifies the behaviour of the instance
于 2013-04-04T02:47:29.567 回答
2

不使用类的一种解决方案是

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];

function doSomething(){
    console.log(this.name)
}

$.each(manyOfThem, function(index, item) {
  doSomething.call(item);
});

演示:小提琴

如果你想创建一个类型的实例MyClas然后

var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];

function MyClass(item){
    $.extend(this, item);
}

MyClass.prototype.doSomething = function(){
    console.log(this.name)
}

$.each(manyOfThem, function(index, item) {
    var obj = new MyClass(item);
    obj.doSomething()
});

演示:小提琴

于 2013-04-04T03:03:38.423 回答
0

你可以做

var myClass = function(item){  
    for( i in item){  
        if (item.hasOwnProperty(i)){
            this[i] = item[i];
        }
    }
};

这应该减少myClass构造函数中的重复分配。

于 2013-04-04T02:55:22.800 回答