昨日の記事書いてて気づいたのですが、コンストラクタでデフォルト値を受け取って初期化するときの処理をシンプルに書けそうです。
いままで↓こういうふうにしていたのが
// 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()
やってる処理の目的が明確になるのがいいですね。