Function 调用函数或属性getter的CoffeeScript习惯用法

Function 调用函数或属性getter的CoffeeScript习惯用法,function,properties,coffeescript,shortcut,Function,Properties,Coffeescript,Shortcut,对象属性可以是简单属性或函数。在CoffeeScript中是否有更简单的方法获取此属性的值 value=如果obj.property的类型是“function”,那么obj.property()或者obj.property我不知道它是否惯用,但您可以使用(滥用?)用于此目的 当你这么说的时候: obj.p?() # ---^ CoffeeScript会将其转换为: typeof obj.p === "function" ? obj.p() : void 0 因此,如果p是一个函数,它将被调用

对象属性可以是简单属性或函数。在CoffeeScript中是否有更简单的方法获取此属性的


value=如果obj.property的类型是“function”,那么obj.property()或者obj.property
我不知道它是否惯用,但您可以使用(滥用?)用于此目的

当你这么说的时候:

obj.p?()
# ---^
CoffeeScript会将其转换为:

typeof obj.p === "function" ? obj.p() : void 0
因此,如果
p
是一个函数,它将被调用,否则您将得到
未定义的
。然后,如果
obj.p?()
未定义,则可以使用另一个存在运算符返回到
obj.p

obj.p?() ? obj.p
但是,如果你有:

obj =
    u: -> undefined
然后
obj.u?()?obj.u
将返回整个函数,而不是函数返回的未定义的。如果您必须面对这种可能性,那么我认为您必须编写自己的函数:

prop = (x) ->
    # Argument handling and preserving `@` is left as an exercise
    if typeof x == 'function'
        x()
    else
        x
然后说,
x=propobj.maybe\u function\u maybe\u not

演示:

如果碰巧有下划线,可以使用它的函数:

prop = (x) ->
    # Argument handling and preserving `@` is left as an exercise
    if typeof x == 'function'
        x()
    else
        x
结果
结果(对象、属性)

如果命名的属性的值是一个函数,则使用对象作为上下文调用它;否则,请退回


谢谢我使用的不是下划线,而是WinJS。我也可以在那里轻松地注入此功能。我想知道冰镇CS是否支持这种开箱即用的方式。我想如果你需要它,你是在尝试将CoffeeScript制作成它不需要的东西。是否确实要将对象方法的每次访问都包装在
if
语句中?您应该知道是访问属性还是调用方法。这是一种常见模式。命名属性可以是简单属性,也可以是更复杂的函数。这个问题的原因正是为了防止我用这种糟糕的代码包装每一个这样的任务。这是其他语言中的常见模式。