0

私はJSで少し遊んでいて、次のコードスニペットを持っています

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

私がやりたいのは、このinvokeOnDog関数を単純化して、同じテンプレートを 2 回繰り返すことです。オブジェクトで呼び出す必要があるメソッドを何らかの方法で返すことを考えていますが、その方法がわかりません。

それを手伝ってくれませんか?

編集:

素早い回答ありがとうございます。「what」が呼び出すメソッドと同じ名前であれば問題ありません。しかし、これらの 2 つが一致しない場合はどうなるでしょうか。

invokeOnDog('aggresive')bark メソッドをinvokeOnDog('scared')呼び出し、run を呼び出す必要があります

4

7 に答える 7

5

オブジェクトのプロパティ (この場合は「bark」と「run」メソッド) に文字列からアクセスできます。

object.property

あなたが使う

object['property']

そして、変数に「プロパティ」がある場合は、次のことができます

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

呼び出したいメソッドの名前を持つ変数があるため、次の方法でメソッドを呼び出すことができます。

dogs[i][what]();

したがって、次のようになります。

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

アップデート:

変数が呼び出したいメソッドと関係がない場合は、マッピングを使用して関係を設定できます。

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

これは最も単純なコードですが、「位置」の値が「メソッド」のキーであり、継承されたメソッドではないかどうかを確認することをお勧めします。

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

それ以外の場合、「invokeOnDog('toString')」は関数である「methods['toString']」にアクセスします。

于 2012-10-08T11:18:29.117 に答える
1

Javascript 配列構文を使用して、オブジェクトのフィールドにアクセスすることもできます。で代用dog.bark()できますdog["bark"]()

function invokeOnDog(what) {
    for(var i=0; i<dogs.length; i++) {
         dogs[i][what]();         
    }     
} 
于 2012-10-08T11:20:28.993 に答える
1

また、呼び出す前にプロパティが存在するかどうかを確認する必要があります。

function invokeOnDog(what) {
  if (Dog.prototype.hasOwnProperty(what)) {
    for (i = 0, len = dogs.length; i < len; i++) {
      dogs[i][what]();
    }
  }
}
于 2012-10-08T11:20:02.440 に答える
1

関数を保持するプロパティにアクセスするには、ブラケット表記を使用します。

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

犬にメソッドが存在するかどうかのチェックを追加したい場合は、what in dogs[i]ortypeof dogs[i][what] == "function"を使用できます。

于 2012-10-08T11:18:02.020 に答える
0
    function invokeOnDog(what) {
        for(var i=0; i<dogs.length; i++) {
          dogs[i][what]()
        }            
    }

これを試してください、私はそれがうまくいくと思います

于 2012-10-08T11:16:25.043 に答える
0

通常の属性ルックアップでメソッドにアクセスできます。

function invokeOnDog(what) {

    if(what === 'bark' || what === 'run') {
        for(var i=0; i<dogs.length; i++) {
            dogs[i][what]();
        }
    }
}
于 2012-10-08T11:17:32.217 に答える
0

このような?

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")]
于 2012-11-09T00:57:22.723 に答える