0

我正在尝试为名为_name 的字段重载setter / getter 值。我想知道在咖啡脚本中是否有更简单的方法可以做到这一点,因为这可行但非常冗长。

class MyObject
  constructor: (@_defaultName) ->
  name: (colName) ->
    @_name = colName if colName?
    if @_name then @_name else @_defaultName

对于 name 方法,如果未设置参数,则将该方法视为 getter 并返回 _name 值,如果未设置 _name 则返回默认值。我想做更多这样的事情,但我无法让它正常工作:

class MyObject
  constructor: (@_defaultName) ->
  name: (@_name) -> if @_name? then @_name else @_defaultName

这样的模式是否已经存在?感谢您的时间。

4

2 回答 2

3

有很多方法可以做到这一点。首先,我想指出语法在构造函数之外确实有效,但在这种情况下,如果它被称为 getter(它会清除) ,(@_name) ->它会做坏事。这是我将如何做到这一点:@_namenull

class A
  constructor: (@_defaultName) ->
  name: (_name) =>
    if arguments.length > 0
      @_name = _name
    else
      @_name ? @_defaultName

如果你放弃了,你会得到同样的东西else——这只是风格上的不同。如果你愿意,你也可以做单线if,但对我来说,这感觉就像一条非常长的线。

?运算符 ( )x ? y表示if @_name !== null then @_name else @_defaultName

根据@muistooshort 的评论,我更改_name?arguments.length > 0,允许设置@_namenull。但是,请注意,将其设置为null(可能是“取消设置”它)将导致它恢复为默认值。

于 2013-06-15T15:56:08.463 回答
1

是的,@据我所知,仅适用于构造函数的参数。我会在这里保持清晰。从您的代码(任一版本)中实际上并不明显您的意思是该函数是一个 getter 和一个 setter。我会选择比你原来的冗长的东西:

class MyObject
  constructor: (@_defaultName) ->
  name: (colName) ->
    if colName?
      @_name = colName
    else
      if @_name then @_name else @_defaultName

这样做的目的似乎要明显得多。

于 2013-06-15T08:55:36.947 回答