我有一堆以特定格式从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();
无论如何,如果还有(安全性?)原因我为什么不得不吮吸它并手动完成它们请分享,谢谢!
答案 0 :(得分: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();
的调用仍会提醒"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
答案 1 :(得分:2)
不使用班级的一种解决方案是
var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];
function doSomething(){
console.log(this.name)
}
$.each(manyOfThem, function(index, item) {
doSomething.call(item);
});
演示:Fiddle
如果要创建类型为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()
});
演示:Fiddle
答案 2 :(得分:0)
你可以做到
var myClass = function(item){
for( i in item){
if (item.hasOwnProperty(i)){
this[i] = item[i];
}
}
};
这应该减少myClass
构造函数中的重复分配。