2012-10-08 20 views
0

我與JS打了一下,有下面的代碼片段javascript如何通過返回方法來簡化這段代碼來執行?

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')應該調用樹皮方法和invokeOnDog('scared')應該調用運行

+0

謝謝,我已經編輯了這個問題,並增加了一個案例。 – grafthez

+0

然後,您應該查看[**工廠模式**](http://www.joezimjs.com/javascript/javascript-design-patterns-factory/)。 –

回答

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’)’將訪問‘的方法[‘的toString’]’誰是一個函數。

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

試試這個,我認爲它應該工作

0

您可以用普通的屬性查找訪問方法。

function invokeOnDog(what) { 

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

使用bracket notation訪問其持有的函數的性質:

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

也許你想添加一個檢查對狗的方法是否存在等,你可以使用what in dogs[i]typeof dogs[i][what] == "function"爲。

1

您也應該檢查是否該屬性調用之前就存在:

function invokeOnDog(what) { 
    if (Dog.prototype.hasOwnProperty(what)) { 
    for (i = 0, len = dogs.length; i < len; i++) { 
     dogs[i][what](); 
    } 
    } 
} 
1

的Javascript數組的語法也可用於對象的訪問領域。所以dog.bark()可以用dog["bark"]()代替。

function invokeOnDog(what) { 
    for(var i=0; i<dogs.length; i++) { 
     dogs[i][what]();   
    }  
} 
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")] 
相關問題