2013-04-04 23 views
5

Ajax çağrısından belirli bir biçimde döndürülen bir grup JSON dizilim var ve hepsini kendi Javascript nesnesine dönüştürmeye başladığımda daha kolay bir yol olup olmadığını merak etmeye başladım Buradaki Javascript’ten bahsediyoruz.JSON dizgisini işlev örneğine döndürme Javascript

Ben var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; gerekecek Ve ben gibi şeyler yapabilirsiniz, böylece kolayca benim fonksiyonları ile bu nesnelerin her biri ilişkilendirmek istediğiniz:

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

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

benim husustur tahmin, ben istemem için (onun tekrarlayan çünkü) bunu:

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(); 

neyse, ayrıca ben de paylaşır mısınız sadece o kadar emmek zorunda ve elle hepsini yapardım neden (güvenlik?) nedenler varsa, teşekkürler!

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

Sonra Yani

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

Arayabileceğin:

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

Ancak, bu yaklaşım doğrudan korumak olmaz

+0

Ben bunu doSomething' 'te istediğinize bağlıdır düşünüyorum. Planın ne olduğunu paylaşabilir misin? Gibi neden sadece '' doSomething' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Ian

+0

Her zaman "myClass" bir diziyi kabul edebilir (bu durumda "ManyOfThem"). Ardından, öğelerinden birini (bazı "doSomething" işlevini çağırmak) değiştirmek istediğinizde, 3 dizini anlamında "myClass.doSomething (3)" ifadesini kullanabilirsiniz. Daha sonra dahili olarak, dizideki 3. öğe üzerinde çalışır (diziyi göstermeden). – Ian

+0

@ian Eh, gerçekten bir şey olabilir, ve eğer bir şey yapamazsa, bir şey dışında bir şey olsaydı, 1. küresel isim alanında, 2. karşı nesne yönelimli tasarım – Lim

cevap

3

Sen gibi bir şey (jsfiddle bakınız) demek manyOfThem nesnesiyle kopyalayın. . (Yukarıdaki örnekte, değişen manyOfThem[0].name = "foo";manyObj[0] etkilemez ve manyObj[0].doSomething(); bir çağrı hala tetikte "a" sizin nesnesine doğrudan atıfta korumak için olacak, bunu:

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 
+0

Merhaba, çok teşekkürler, uzatırım işlev, aradığım anahtardır. Ancak, nesnelere doğrudan bir referans vermek için, prototipin de bu gibi örnek değişkenleri içerdiğini onaylayabilir miyim.name' ve _can_ tamamen "F.prototype" içine kopyalanabilir mi? – Lim

+1

Evet, tanımlanan herhangi bir işlev veya özellik, nesneye kopyalanacaktır. Örneğin, bir nesneyi klonlamak şöyle yapılır: 'var clone = $ .extend ({}, sourceObj);'. Bu durumda, 'ftprototype',' 'newOfThem' nesnelerini şablon olarak kullanarak yeni prototipler oluşturmak için anonim bir sınıf düzeyi fonksiyon kurucusu olarak hareket eder, daha sonra bunları 'MyClass'ın yeni örnekleriyle genişletir (böylece her birinin bireysel kapsamları vardır). –

+0

Dürüst olmak zorundayım ve hala bir 'prototip' içine kopyalanan nesne örneği özellikleri kavramını tam olarak almıyorum ama semantiklerin yaptığı her şeyi tahmin edin, işte bu. Cevaplarınız için teşekkürler! – Lim

0

bunu yapabilirsiniz

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

Bu myClass yapıcı tekrarlanan atamaları azaltacaktır.

bir sınıf kullanmadan
2

bir çözüm

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

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

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

Demo: Fiddle

türe MyClas bir örneğini oluşturmak istiyorsanız o zaman

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

Demo: Fiddle

İlgili konular