对象属性可以是简单属性或函数。在CoffeeScript中有一些更简单的方法来获取此属性的value
吗?
value = if typeof obj.property is "function" then obj.property() else obj.property
答案 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)
如果指定的属性的值是一个函数,则使用对象作为上下文调用它;否则,退货。