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
您可以从字符串中访问对象属性(在本例中为'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']"谁是一个函数.