存在演算子を使用できます:
class Foo
constructor: (options = {}) ->
@bar = options.bar ? 10
@moo = options.moo ? 20
そのコンストラクターは次のようにコンパイルされます。
// Compiled JS.
function Foo(options) {
var _ref, _ref1;
if (options == null) {
options = {};
}
this.bar = (_ref = options.bar) != null ? _ref : 10;
this.moo = (_ref1 = options.moo) != null ? _ref1 : 20;
}
同等の代替手段は、オプション オブジェクトをすぐに破棄し (したがって、不要な名前を避ける)、それらのオプションが渡されなかった場合に備えて既定値を設定することです。
class Foo
constructor: ({@bar, @moo} = {}) ->
@bar ?= 10
@moo ?= 20
オプションを指定してオブジェクトを渡すことは JS コードの一般的なパターンであるため、一部のライブラリにはこれに役立つ便利なユーティリティ関数があります。たとえば、アンダースコアは を提供します_.defaults
。これにより、非常に読みやすいコードになると思います。
class Foo
constructor: ({@bar, @moo} = {}) ->
_.defaults @, bar: 10, moo: 20
Underscore を使用して$.extend
いない場合は、(とにかく jQuery を使用しないのは誰ですか?):
class Foo
defaults = bar: 10, moo: 20
constructor: (options = {}) ->
{@bar, @moo} = $.extend {}, defaults, options
渡される唯一のオプションが有効なものであると信頼できる場合はextend
、オブジェクトを直接使用することもできます (これにより、他のものと比較して非常に最小限の JS になります)。Foo
class Foo
defaults = bar: 10, moo: 20
constructor: (options = {}) ->
$.extend @, defaults, options
そして、最後の代替手段は、にデフォルト値をFoo.prototype
設定し、オプション パラメータに含まれる場合にのみ独自のプロパティとして設定することです。
class Foo
bar: 10
moo: 20
constructor: ({bar, moo} = {}) ->
@bar = bar if bar?
@moo = moo if moo?
これにより、 のすべてのインスタンスがFoo
独自の個別のプロパティを持つことを防ぎ、代わりにインスタンス間で同じプロパティを共有します。これは通常、メソッドで行われるのと同じです。@bar = bar if @bar isnt bar
パラメータ値がデフォルト値と異なる場合にのみ、これらのプロパティを割り当てることもできます。
ご覧のとおり、これを行うには非常に多くの方法があります。どれも完璧ではありません。すべてに長所と短所があるため、ニーズ/好み/その他に適したものを選択してください = D