CoffeeScript成语要么调用函数或属性getter

时间:2014-12-09 19:14:10

标签: function properties coffeescript shortcut

对象属性可以是简单属性或函数。在CoffeeScript中有一些更简单的方法来获取此属性的value吗?

value = if typeof obj.property is "function" then obj.property() else obj.property

1 个答案:

答案 0 :(得分:1)

我不知道这是否是惯用的,但您可以为此目的使用(滥用?)existential operator

当你这样说时:

obj.p?()
# ---^

CoffeeScript会将其转换为:

typeof obj.p === "function" ? obj.p() : void 0

所以,如果p是一个函数,它将被调用,否则你得到undefined。然后,如果obj.p未定义,您可以投入另一个存在运算符以回退到obj.p?()

obj.p?() ? obj.p

虽然你有:

,但这里有一个整体
obj =
    u: -> undefined

然后obj.u?() ? obj.u将返回整个函数,而不是函数返回的undefined。如果你不得不面对这种可能性,那么我认为你不得不写自己的功能:

prop = (x) ->
    # Argument handling and preserving `@` is left as an exercise
    if typeof x == 'function'
        x()
    else
        x

并说x = prop obj.maybe_function_maybe_not

演示:http://jsfiddle.net/ambiguous/hyv6pdtc/

如果您碰巧使用了Underscore,您可以使用它的result功能:

  

结果 _.result(object, property)

     

如果指定的属性的值是一个函数,则使用对象作为上下文调用它;否则,退货。