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功能,因为它重复相同的模板两次。我正在考虑以某种方式返回应该在对象上调用的方法,但不知道该怎么做。

你能帮我解决这个问题吗?

编辑:

感谢您的快速回复。如果“what”与调用的方法同名,它们就可以了。但是如果这两者之间没有匹配呢?

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

4

7 回答 7

5

如果不是

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

使用括号符号来访问包含函数的属性:

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

也许你想检查狗的方法是否存在,你可以使用what in dogs[i]or typeof dogs[i][what] == "function"

于 2012-10-08T11:18:02.020 回答
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

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 回答
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 回答