2013-04-04 13 views
5

Mam ciąg znaków JSON zwrócony z wywołania ajax w określonym formacie i kiedy zaczynam konwertować je wszystkie na mój własny obiekt JavaScript, zaczynam się zastanawiać, czy istnieje jakiś prostszy sposób ponieważ mówimy tutaj Javascript.JavaScript zamienia łańcuch JSON na instancję funkcji

Muszę var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; I chciałbym łatwo skojarzyć każdy z tych obiektów z moich funkcji tak, że mogę robić takie rzeczy jak:

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

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

Chyba moje obawy o to, że nie chcą do (ponieważ jego powtarzalne) to zrobić:

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

tak czy inaczej, jeśli istnieje również zabezpieczenia (?) powody, ja po prostu ssać go i zrobić je wszystkie ręcznie proszę podzielić się jak dobrze, dzięki!

+0

myślę, że to zależy od tego, co chcesz w 'doSomething'. Czy możesz podzielić się swoim planem? Na przykład, dlaczego nie mogłeś po prostu utworzyć funkcji 'doSomething' i przekazać do niej' item'? – Ian

+0

Zawsze możesz mieć 'myClass' akceptować tablicę (' manyOfThem' w tym przypadku). Następnie, gdy chcesz manipulować jednym z jego elementów (wywołując funkcję 'doSomething'), możesz zrobić' myClass.doSomething (3) 'oznaczający trzeci indeks. Następnie wewnętrznie działałby tylko na trzeci element tablicy (bez wystawiania tablicy). – Ian

+0

@ian Cóż, to naprawdę może być cokolwiek, a jeśli 'coś" coś by było poza tym byłoby 1. w globalnej przestrzeni nazw, 2. zorientowane na obiekt obiektowy – Lim

Odpowiedz

3

Masz na myśli coś takiego (patrz jsfiddle):

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

Następnie

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

Więc można nazwać:

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

Jednak takie podejście nie będzie zachować bezpośredni skopiuj z obiektem manyOfThem. . (W powyższym przykładzie, zmieniając manyOfThem[0].name = "foo"; nie wpłynie manyObj[0] i wezwanie do manyObj[0].doSomething(); będzie nadal alert "a" Aby zachować bezpośrednie odniesienie do obiektu, to zrobić:

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

Cześć, wielkie dzięki, myślę, że rozszerzenie funkcja jest kluczem, którego szukam. Ale aby zachować bezpośrednie odniesienie do mojego obiektu, mogę potwierdzić, że prototyp będzie zawierał również zmienne instancji takie jak 'this.name' i _can_ mogą być skopiowane do 'F.prototype' w ogóle? – Lim

+1

Tak, dowolna zdefiniowana funkcja lub właściwość zostanie skopiowana do obiektu. Na przykład klonowanie obiektu odbywa się za pomocą: 'var clone = $ .extend ({}, sourceObj);'. W tym przypadku 'F.prototype' działa jako anonimowy konstruktor funkcji klasy klasowej, aby tworzyć nowe prototypy z użyciem twoich obiektów' manyOfThem' jako szablonów, a następnie rozszerzać je o nowe instancje 'MyClass' (więc każdy z nich ma indywidualne zakresy). –

+0

Będę musiał być szczery i powiedzieć, że wciąż nie pojmuję koncepcji kopiowania właściwości instancji obiektu do "prototypu", ale chyba to, co robi semantyka, to jest to, co robi. Wielkie dzięki za odpowiedź! – Lim

0

Można zrobić

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

ta powinna zmniejszyć powtarzalnych zadań w myClass konstruktora.

2

Jedno rozwiązanie bez użycia klasy jest

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

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

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

Demo: Fiddle

Jeśli chcesz utworzyć wystąpienie typu MyClas następnie

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

Powiązane problemy