我遍历一个对象并将属性名称与给定参数进行比较;如果有匹配,我想要执行属性函数。我怎样才能明确地称呼它?在循环中运行对象属性函数
对象:
@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