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
7 Antworten
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.
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.
function invokeOnDog(what) {
for(var i=0; i<dogs.length; i++) {
dogs[i][what]()
}
}
Versuchen Sie dies, ich denke, es sollte funktionieren
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]();
}
}
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]();
}
}
}
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")]
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]();
}
}
}