2013-10-29 26 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)来优化循环中的单个属性访问。 –