Ich spiele ein bisschen mit JS und habe folgendes Code-Snippet

var Dog = function(name) {
    this.name = name
}

Dog.prototype= {
    'bark': function() {
        alert(this.name + ' is barking');
    },
    'run': function() {
        alert(this.name + ' is running');
    }
}

var dogs = [new Dog('first'), new Dog('second'), new Dog('third')];


function invokeOnDog(what) {
    if(what === 'bark') {
        for(var i=0; i<dogs.length; i++) {
            dogs[i].bark();
        }
    }
    if(what === 'run') {
        for(var i=0; i<dogs.length; i++) {
            dogs[i].run();
        }
    }
}

Ich möchte diese invokeOnDog -Funktion vereinfachen, da dieselbe Vorlage zweimal wiederholt wird. Ich denke darüber nach, eine Methode zurückzugeben, die für ein Objekt aufgerufen werden sollte, habe aber keine Ahnung, wie das geht.

Könnten Sie mir dabei helfen?

BEARBEITEN:

Vielen Dank für die schnellen Antworten. Sie sind in Ordnung, wenn "what" den gleichen Namen wie die aufzurufende Methode hat. Aber was ist, wenn es keine Übereinstimmung zwischen diesen beiden gibt?

invokeOnDog('aggresive') sollte die Bark-Methode aufrufen und invokeOnDog('scared') sollte run aufrufen

0
grafthez 8 Okt. 2012 im 15:12

7 Antworten

Beste Antwort

Sie können auf eine Objekteigenschaft (in diesem Fall auf die Methode 'bark' und 'run') über eine Zeichenfolge zugreifen, wenn anstelle von

object.property

Sie nutzen

object['property']

Und wenn Sie "Eigenschaft" in einer Variablen haben, können Sie dies tun

var thing = 'property';
object[thing];

Da Sie eine Variable mit dem Namen der Methode haben, die Sie aufrufen möchten, können Sie die Methode aufrufen mit:

dogs[i][what]();

So wird es also sein:

function invokeOnDog(what) {
    if (what === 'bark' || what === 'run') {
        for(var i=0; i<dogs.length; i++) {
            dogs[i][what]();
        }
    }
}

Aktualisieren:

Wenn die Variable keine Beziehung zu der Methode hat, die Sie aufrufen möchten, können Sie die Beziehungen mithilfe einer Zuordnung festlegen:

function invokeOnDog(position) {
    var methods = {
        'agressive': 'bark',
        'defensive': 'run'
    };
    var method = methods[position];

    if (method)
        for(var i=0; i<dogs.length; i++) {
            dogs[i][method]();
        }
    }
}

Dies ist der einfachste Code, aber ich empfehle Ihnen zu überprüfen, ob der Wert "position" ein Schlüssel für "Methoden" und keine geerbte Methode ist:

function invokeOnDog(position) {
    var methods = {
        'agressive': 'bark',
        'defensive': 'run'
    };

    if (mehtods.hasOwnProperty(position) {
        var method = methods[position];

        for(var i=0; i<dogs.length; i++) {
            dogs[i][method]();
        }
    }
}

Andernfalls greift "invokeOnDog ('toString')" auf "Methoden ['toString']" zu, die eine Funktion sind.

5
A. Matías Quezada 15 März 2013 im 15:21

Verwenden Sie die Klammernotation, um auf die Eigenschaften zuzugreifen, die Halten Sie die Funktionen:

function invokeOnDog(what) {
    for (var i=0; i<dogs.length; i++)
        dogs[i][what]();
}

Vielleicht möchten Sie eine Überprüfung für die Existenz der Methode bei Hunden hinzufügen, Sie können dafür what in dogs[i] oder typeof dogs[i][what] == "function" verwenden.

1
Bergi 8 Okt. 2012 im 11:18
    function invokeOnDog(what) {
        for(var i=0; i<dogs.length; i++) {
          dogs[i][what]()
        }            
    }

Versuchen Sie dies, ich denke, es sollte funktionieren

0
Anton 8 Okt. 2012 im 11:16

Die Javascript-Array-Syntax kann auch verwendet werden, um auf Objektfelder zuzugreifen. dog.bark() kann also durch dog["bark"]() ersetzt werden.

function invokeOnDog(what) {
    for(var i=0; i<dogs.length; i++) {
         dogs[i][what]();         
    }     
} 
1
Philipp 8 Okt. 2012 im 11:20

Sie können mit einer normalen Attributsuche auf die Methode zugreifen.

function invokeOnDog(what) {

    if(what === 'bark' || what === 'run') {
        for(var i=0; i<dogs.length; i++) {
            dogs[i][what]();
        }
    }
}
0
cammil 8 Okt. 2012 im 11:17

So was?

function invokeOnDog(a) {
if (a === "bark") for (var b = 0; dogs.length > b; b++) dogs[b].bark();
if (a === "run") for (var b = 0; dogs.length > b; b++) dogs[b].run()
}
var Dog = function (a) {
this.name = a
};
Dog.prototype = {
bark: function () {
    alert(this.name + " is barking")
},
run: function () {
    alert(this.name + " is running")
}
};
var dogs = [new Dog("first"), new Dog("second"), new Dog("third")]
0
Truls Larsen 9 Nov. 2012 im 00:57

Sie sollten auch überprüfen, ob die Eigenschaft vorhanden ist, bevor Sie Folgendes aufrufen:

function invokeOnDog(what) {
  if (Dog.prototype.hasOwnProperty(what)) {
    for (i = 0, len = dogs.length; i < len; i++) {
      dogs[i][what]();
    }
  }
}
1
dan-lee 8 Okt. 2012 im 11:20