0

_name というフィールドのセッター/ゲッター値をオーバーロードしようとしています。これは機能しますが、非常に冗長であるため、coffeescriptでこれを行う簡単な方法があるかどうか疑問に思っていました。

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

これを行うにはいくつかの方法があります。(@_name) ->まず、構文はコンストラクタの外でも機能しますが、この場合、ゲッターとして呼び出されると悪いことをすることを指摘したいと思います (それは にクリア@_nameされますnull)。これを行う方法は次のとおりです。

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これにより、 に設定でき@_nameますnull。ただし、設定するとnull(おそらく「設定解除」)、デフォルトに戻ることに注意してください。

于 2013-06-15T15:56:08.463 に答える
1

ええ、@私が知る限り、コンストラクターへのパラメーターでのみ機能します。ここでは明確にすることに固執します。関数がゲッターとセッターであることを意味することは、コード(どちらのバージョンでも)からは実際には明らかではありません。私はあなたのオリジナルよりもさらに冗長なものを使います:

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

それが何をすることを意味するかは、はるかに明白に思えます。

于 2013-06-15T08:55:36.947 に答える