2017-12-17 12 views
2

Ich habe mehrere Objekte des gleichen Typs, und will die gleiche Funktion von jedem von ihnen laufen:Javascript die gleiche Funktion aus mehreren Objekten ausführen

function animal(name){ 
    this.name = name 
    function foo(){ 
     console.log(this.name); 
    } 
} 

var dog = new animal("dog"); 
var cat = new animal("cat"); 
var bird = new animal("bird"); 

Normalerweise würde ich dies nur tun:

dog.foo(); 
cat.foo(); 
bird.foo(); 

Aber das ist keine sehr effiziente Art, es zu tun, wenn ich, sagen wir, hundert davon habe. Gibt es eine Möglichkeit, foo() von jedem Tier mit nur wenigen Zeilen zu starten?

Antwort

3

Nun, es zu tun effizient müssen Sie Ihre Objekte effizient organisiert haben. Die effizienteste Möglichkeit, mehrere Objekte zu ordnen, ist normalerweise ein Array. Sie erstellen also ein Array mit all Ihren Tieren und rufen foo auf jedem von ihnen an. Arrays können Sie genau das tun, rufen Sie die Funktion nur einmal im Code, aber es passiert für alle Objekte.

Hier müssen Sie darüber nachdenken, ob zu irgendeinem Zeitpunkt ein Tier ohne die Funktion foo() existieren könnte. Wenn nicht, lassen Sie es einfach wie es ist, wenn ja, dann rufen Sie eine andere Funktion oder einfach ignorieren, dass bestimmte Tier, je nach Fall:

Erstellen der Objekte:

let animalArray = [] 
animalArray.push(new Animal("cat")) 
animalArray.push(new Animal("dog")) 
animalArray.push(new Animal("bird")) 
animalArray.push(new Animal("hippo")) 

Aufruf foo () auf jedem Objekt:

animalArray.forEach(animal => animal.foo()) 

ES5:

animalArray.forEach(function(animal){ 
    animal.foo() 
}) 

Wenn ein Tier möglicherweise nicht foo():

animals.forEach(animal => { 
    if(animal.foo){ 
     animal.foo() 
    }else{ 
     //call other function or ignore and do nothing 
     animal.bar() 
    } 
}) 
+0

Warum er 'Tier: ein Tier Instanzen ohne die 'foo' Methode zu denken hat: Es ist genau dort in der Konstruktor-Funktion –

+0

Oh, das könnte dich verwirren, du bist richtig, ich war mehr Bezug auf, wenn Sie mehrere Objekte speichern und nicht nur Tiere. Also für den Fall, dass Sie neue Animal() und neue Alien() drücken und Aliens nicht foo() haben. Aber ja, du bist richtig, wenn seine einzigen Tiere nicht überprüft werden sollten – ThatBrianDude

-3

können Sie ein Array erstellen, und dann die Schleife durch das Array, dem Aufruf der Funktion

+0

@hippo_o_matic Ich denke, Sie werden die anderen Antworten mit Code-Beispiele zu finden sein hilfreicher –

0

Zunächst einmal ist die Konvention in Großbuchstaben Ihrer Konstruktorfunktion

function Animal(name){ 
    this.name = name 
    function foo(){ 
     console.log(this.name); 
    } 
} 

Ich habe gesagt, dies zu sein in der Lage, animal als eine Variable innerhalb reduce ohne eine Kollision zu verwenden (vielleicht hätte ich name verwendet werden können, aber ich dachte den obigen Punkt in Bezug auf Namenskonvention für ein Konstrukt ctor-Funktion hat sich gelohnt).

Dann, um dies so effizient wie möglich zu machen, da Sie Effizienz, mit der Sie vermutlich Zeilen des Codes bedeuten, bringen Sie alle Ihre Tiernamen in einem Array vor. Erstellen Sie dann ein Objekt, das aus allen Tiernamen besteht, als Schlüssel und Werte wie Animal Instanzen, indem Sie reduce verwenden. Schließlich können wir die Animal Instanzen in der Anzeigenreihenfolge durchlaufen, indem wir forEach auf animalNames aufrufen; a for animal in animalObjects Schleife ist nicht garantiert, um die Objekte in Anzeigenreihenfolge zurückzugeben.

Die angenommene Antwort im Vergleich skaliert nicht, da Sie Tiere hinzufügen, müssen Sie einen zusätzlichen Anruf hinzufügen, um zu drücken.Mit meinem Beispiel über alles, was Sie tun müssen ist, fügen Sie Einträge in die animalNames Arrayliteral:

var animalNames = ['dog','cat','bird','squirrel','skunk','opposum']; //etc. 

Ein weiterer Vorteil der oben genannten ist, dass diese animalNames könnte von JSON

0

zuerst, wenn Sie „foo“ wollen Um eine classMethode zu sein, müssen Sie diese an eine klarere Methode binden, indem Sie eine Klassendefinition verwenden. Und das ist ein funktioneller Ansatz:

class Animal { 
    constructor(name) { 
    this.name = name; 
    } 
    woof(){ 
    console.log(this.name, 'is woofing!'); 
    } 
} 

var animalNames = ['dog', 'cat', 'bird']; 

var animals = animalNames.map((name) => new Animal(name)); 

animals.map((animal) => animal.woof()); 
Verwandte Themen