我遍歷一個對象並將屬性名稱與給定參數進行比較;如果有匹配,我想要執行屬性函數。我怎樣才能明確地稱呼它?在循環中運行對象屬性函數
對象:
@headers =
'foo': (obj)->
# do stuff
例行:
resolve: ('foo', item, obj)->
for prop of @headers
if prop == arguments[0]
# execute obj's foo property
我遍歷一個對象並將屬性名稱與給定參數進行比較;如果有匹配,我想要執行屬性函數。我怎樣才能明確地稱呼它?在循環中運行對象屬性函數
對象:
@headers =
'foo': (obj)->
# do stuff
例行:
resolve: ('foo', item, obj)->
for prop of @headers
if prop == arguments[0]
# execute obj's foo property
那麼,你就需要命名第一個參數爲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]?()
字符串參數是爲了清晰。性能方面,檢查prop是否存在並迭代對象有什麼區別?我認爲解析器仍然需要查看每個屬性並在兩種情況下進行比較。 – Ozrix
@Metzger那麼,對於程序員的表現,我會說「* if prop has * *」會比「* for each prop,if equal *」更直接一點。對於執行性能,只有知道確切的方法是基準([JSPerf](http://jsperf.com/))。但是,大多數引擎可能會使用類似[哈希表](https://en.wikipedia.org/wiki/Hash_table)來優化循環中的單個屬性訪問。 –
是的,編輯。我的錯。 – Ozrix