2013-10-29 48 views
1

我遍歷一個對象並將屬性名稱與給定參數進行比較;如果有匹配,我想要執行屬性函數。我怎樣才能明確地稱呼它?在循環中運行對象屬性函數

對象:

@headers = 
    'foo': (obj)-> 
     # do stuff 

例行:

resolve: ('foo', item, obj)-> 
    for prop of @headers 
     if prop == arguments[0] 
     # execute obj's foo property 
+0

是的,編輯。我的錯。 – Ozrix

回答

1

那麼,你就需要命名第一個參數爲CoffeeScript的估計不會有串在那裏。

但是,如果我理解正確的話,你可以經過member operator使用?存在」運營商(在Operators and Aliases子部分記錄):

resolve: (prop, item, obj)-> 
    if @headers[prop]? 
     obj[prop]() 

這將編譯到:

resolve: function(prop, item, obj) { 
    if (this.headers[prop] != null) { 
    return obj[prop](); 
    } 
} 

而且,如果您還想測試obj上的方法,則可以將?放置在成員操作符a nd參數/調用括號:

obj[prop]?() 
+0

字符串參數是爲了清晰。性能方面,檢查prop是否存在並迭代對象有什麼區別?我認爲解析器仍然需要查看每個屬性並在兩種情況下進行比較。 – Ozrix

+0

@Metzger那麼,對於程序員的表現,我會說「* if prop has * *」會比「* for each prop,if equal *」更直接一點。對於執行性能,只有知道確切的方法是基準([JSPerf](http://jsperf.com/))。但是,大多數引擎可能會使用類似[哈希表](https://en.wikipedia.org/wiki/Hash_table)來優化循環中的單個屬性訪問。 –