javascript如何通过返回执行方法来简化此代码?

gra*_*hez 0 javascript refactoring functional-programming

我正在玩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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的是简化这个invokeOnDog功能,因为它重复两次相同的模板.我正在考虑以某种方式返回应该在对象上调用的方法,但不知道如何做到这一点.

你能帮帮我吗?

编辑:

感谢您的快速回复.如果"what"与调用方法具有相同的名称,则它们都可以.但如果这两者之间没有匹配怎么办?

invokeOnDog('aggresive')应该调用bark方法并invokeOnDog('scared')应该调用run

A. *_*ada 5

您可以从字符串中访问对象属性(在本例中为'bark'和'run'方法),而不是

object.property
Run Code Online (Sandbox Code Playgroud)

你用

object['property']
Run Code Online (Sandbox Code Playgroud)

如果你在变量中有"属性",你可以做

var thing = 'property';
object[thing];
Run Code Online (Sandbox Code Playgroud)

由于您有一个带有要调用的方法名称的变量,因此可以使用以下方法调用该方法:

dogs[i][what]();
Run Code Online (Sandbox Code Playgroud)

所以它会是这样的:

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

更新:

如果变量与您要调用的方法无关,则可以使用映射来设置关系:

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]();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是最简单的代码,但我建议您检查"position"值是否是"方法"的关键而不是继承的方法:

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]();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

否则"invokeOnDog('toString')"将访问"methods ['toString']"谁是一个函数.