2016-12-12 4 views
1

Betrachten Sie eine Klasse, die eine Menge anderer Objekte enthält.Dynamisch ändern, welche Klassenvariablen von Ihren Klassenfunktionen betroffen sind

function Food=(){ 
this.apples = 8; 
this.orange = 6; 
this.peach = 3; 
} 

Jetzt kann ich eine Add-Funktion erstellen.

Food.prototype.add(food){ 
this.apple += food.apple; 
this.orange+=food.orange; 
this.peach+=food.peach; 
} 

Was aber, wenn ich will wollen dynamisch in einer anderen Sache in Lebensmittel hinzufügen, die hinzufügen werden food.prototype.add auch?

Die erste Frage ist, gibt es eine einfache Möglichkeit, alle Objekte in der Klasse hinzuzufügen?

Die zweite Frage ist: Ich hätte den Code wie folgt schreiben können.

function Food =(){ 
this.apples = 8; 
this.orange = 6; 
this.peach = 3; 
this.addArray = []; 
this.addArray.push(this.apples); 
this.addArray.push(this.orange); 
this.addArray.push(this.peach); 
} 

Food.prototype.add(food){ 
for (i=0, i<this.addArray.length, i++){ 
    this.addArray[i]+=food.addArray[i]; 
} 
} 

diese Weise, wenn ich escargot auf die Dinge hinzufügen möchte ich hinzufügen will, kann ich einfach fügen Sie es dem addArray.

Gibt es eine Möglichkeit, eine ähnliche addSet oder ein addObject zu machen. Anstatt also ein Array mit Indizes zu haben, kann ich stattdessen ein Set oder Objekt mit Namen haben?

+0

Für mich scheint es, als würden Sie hier zwei verschiedene Strukturen zusammenfassen. Ihr "Essen" ist eigentlich "Lebensmittel" mit Namen und Mengenpaaren. Sie sind auf dem richtigen Weg, obwohl Ihre Idee, ein Objekt anstelle eines Arrays zu verwenden, viel besser erscheint. (Hier, mit "viel besser Ansatz", ich meine die einzige, die einen Sinn macht.) –

+0

Sie können durch Objekte Eigenschaften mit 'for (var Element in Obj) {...}', obwohl basierend auf was Sie versuchen, eine Datenstruktur wie ein Array zu tun, wäre eine bessere Idee. Hauptsächlich wegen, wenn Sie irgendwelche anderen Eigenschaften zu Nahrung hinzufügen möchten, die möglicherweise nicht eine Zahl ist, die Sie * hinzufügen * möchten. –

Antwort

1

Ich denke, was Sie ist

function Food() { 
    this.apples = 8; 
    this.orange = 6; 
    this.peach = 3; 
    this.addArray = ["apples", "orange", "peach"]; 
} 

Food.prototype.add = function(food) { 
    for (var i=0, i<this.addArray.length, i++) { 
     this[this.addArray[i]] += food[this.addArray[i]]; 
    } 
}; 

Ich bezweifle jedoch, das ist eine gute Idee, wenn Sie dynamisch hinzufügen willkürlich suchen Früchte. Als eine einfache Möglichkeit, Ihre Klasse zu erweitern, ja, aber für etwas mehr als das verwenden Sie besser eine ordnungsgemäße Map.

+0

Vielen Dank für Ihre Antwort. Ich habe eine Follow-up-Frage. Wenn ich eine Karte verwenden möchte, würde ich dies ändern.addArray zu this.addMap = neue Map(), und dann this.addMap.set ("Äpfel", this.apples), etc. Ist das richtig? –

+0

Nein, ich meinte, du hättest überhaupt keine '.apple'-Eigenschaften. Ein 'Food'-Objekt würde nur eine' this.fruits = new Map ([["Äpfel", 8], ["Orange", 6], ["Pfirsich", 3]])) und das "Hinzufügen" enthalten Methode würde zwei Karten zusammenführen. – Bergi

1

Hey du das auch versuchen können ...

Food.prototype.add(food){ 
for(var i in food) 
{ 
    if(this[i] != undefined) 
    { 
     this[i] += food[i]; 
    } 
} 
} 
Verwandte Themen