2013-04-04 13 views
5

Ich habe eine Reihe von JSON-String von einem Ajax-Aufruf in einem bestimmten Format zurückgegeben und beim Start, um sie alle in mein eigenes Javascript-Objekt zu konvertieren, frage ich mich, ob es einen einfacheren Weg gibt da wir hier Javascript sprechen.Javascript JSON Zeichenfolge in Instanz der Funktion

werde ich var manyOfThem = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ]; Und ich möchte einfach mit meinen Funktionen jedes dieser Objekte verknüpfen, so dass ich Dinge wie tun können:

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

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

Ich denke, meine Sorge ist, würde ich nicht wollen zu (wegen seiner repetitiven) dies zu tun:

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

wie dem auch sei, die Gründe, wenn es auch ist (Sicherheit?), warum ich gerade saugen müss und tun sie alle von Hand als auch teilen, dank bitte!

+0

Ich denke, es hängt davon ab, was Sie wollen in 'doSomething'. Können Sie teilen, was Ihr Plan ist? Wieso könntest du nicht einfach eine 'Funktion' namens' doSomething' machen und 'item' daran übergeben? – Ian

+0

Sie könnten immer 'myClass' ein Array akzeptieren lassen (' manyOfThem' in diesem Fall). Wenn Sie dann eines seiner Elemente manipulieren möchten (indem Sie eine "doSomething" -Funktion aufrufen), können Sie 'myClass.doSomething (3)' verwenden, was den 3. Index bedeutet. Dann würde es intern nur auf dem dritten Element im Array arbeiten (ohne das Array freizulegen). – Ian

+0

@ian Nun, es könnte wirklich alles sein, und wenn "doSomething" eine Funktion außerhalb alles wäre, wäre es 1. im globalen Namespace, 2. Gegenobjekt orientierten Entwurf – Lim

Antwort

3

Sie meinen, so etwas wie (siehe jsfiddle):

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

Dann

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

So kann man nennen:

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

Allerdings wird dieser Ansatz keine direkte bewahren Kopieren Sie mit dem Objekt manyOfThem. . (Im obigen Beispiel, Ändern manyOfThem[0].name = "foo"; nicht manyObj[0] beeinflussen und ein Aufruf an manyObj[0].doSomething(); wird "a" noch Alarm Um einen direkten Bezug auf das Objekt zu erhalten, dies zu tun:

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

Hallo, vielen Dank, ich denke, die zu erweitern Funktion ist der Schlüssel, den ich suche. Aber um einen direkten Bezug auf mein Objekt zu erhalten, kann ich mit Ihnen bestätigen, dass der Prototyp auch Instanzvariablen wie "this" enthält.name' und _can_ können insgesamt in 'F.prototype' kopiert werden? – Lim

+1

Ja, jede definierte Funktion oder Eigenschaft wird in das Objekt kopiert. Das Klonen eines Objekts geschieht beispielsweise mit: 'var clone = $ .extend ({}, sourceObj);'. In diesem Fall fungiert 'F.prototype' als anonymer Funktionskonstruktor auf Klassenebene, um neue Prototypen zu erstellen, die Ihre' manyOfThem'-Objekte als Vorlagen verwenden, und sie dann um neue Instanzen von 'MyClass' erweitern (so dass sie jeweils individuelle Bereiche haben). –

+0

Ich muss ehrlich sein und sagen, dass ich immer noch nicht ganz das Konzept der Objektinstanzeigenschaften in einen "Prototyp" kopiere, aber rate, was auch immer die Semantik macht, das ist was sie tut. Vielen Dank für Ihre Antwort! – Lim

0

Sie tun können

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

Dies sollte die sich wiederholende Aufgaben in myClass Konstruktor reduzieren.

2

eine Lösung ohne eine Klasse verwendet, ist

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

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

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

Demo: Fiddle

Wenn Sie MyClas dann

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 eine Instanz vom Typ erstellen möchten: Fiddle

Verwandte Themen