LoginSignup
9
9

More than 5 years have passed since last update.

Underscore.jsを使ってプロパティの初期化処理をシンプルに書く

Last updated at Posted at 2014-09-19

昨日の記事書いてて気づいたのですが、コンストラクタでデフォルト値を受け取って初期化するときの処理をシンプルに書けそうです。

いままで↓こういうふうにしていたのが

// Before
function MyClass(options) {
  options || (options = {});

  if('hoge' in options) {
    this.hoge = options.hoge;
  }

  if('fuga' in options) {
    this.fuga = options.fuga;
  }

  // etc ...
}

↓こういうふうにスッキりかけます。

// After
function MyClass(options) {
  options || (options = {});

  var acceptOptions = ['hoge', 'fuga'/*, etc ... */];
  _.extend(this, _.pick(options, acceptOptions));
}

受け入れたいプロパティを増やすときはacceptOptionsを増やすだけでよいです。

初期値が必要な場合

// Before
function MyClass(options) {
  options || (options = {});

  this.hoge = options.hoge || 0

  this.fuga = options.fuga || [];

  // etc ...
}

↓これも_#default(object, *defaults)をつかうとスッキりかけますね。

// After
function MyClass(options) {
  options || (options = {});

  var acceptOptions = ['hoge', 'fuga'/*, etc ... */];
  var defaults = {
      hoge: 0,
      fuga: []
  };
  _.extend(this, _.default(_.pick(options, acceptOptions), defaults));
}

defaultsに初期値がないものはそのまま何も起こらないので、必要なプロパティに関してだけ明示的にdefaultsオブジェクトに入れればいいので分かりやすいです。

underscore.jsを使うと_#extend()とか_#pick()とか_#default()やってる処理の目的が明確になるのがいいですね。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9