JavaScriptの関数やクラスではオプションオブジェクトを指定して、オプションを指定しているのをよく見かけます。
オプションですので省略可能なわけで、その場合デフォルト値を採用することになります。このオプションにデフォルト値を設定する汎用的な関数を作成してみました。
解説
オプションを個別に扱う場合の方法を先に示します。
function foo(options) {
options = options || {};
//パターン1
options.bar && this.bar(options.bar);
//パターン2
this.bar(options.bar || "default");
//または
this._bar = options.bar || "default";
//パターン3
options.bar = options.bar || "default";
this.bar(options.bar);
}
foo.prototype._bar = "default";
オプションが指定されていれば設定する
デフォルト値をprototypeで指定しておき、オプションから明示された場合にその値を設定する方法です。
この指定の方法には弱点があって、単純な代入の場合、()を使って演算の優先順位を変更する必要があります。
options.bar && (this._bar = options.bar);
そこでパターン2になります。
値の設定は常に実施する
デフォルト値が初期部分に集まってきて保守がしやすくなります。
これで特に弱点は無いのですが、いっぱいオプションがあると見苦しいので、やはり見苦しいのでパターン3を試します。
事前にオプションを設定しておく
予め未設定のオプションをつぶしておいて、その後、常にプロパティーを設定する方法です。
ここまで来るとオプションの設定処理を汎用化したくなります。
汎用化ルーチン
function setup_options(org, def) {
org = org || {};
for (var nm in def) {
if (def.hasOwnProperty(nm)) {
org[nm] = org[nm] === undefined ? def[nm] : org[nm];
}
}
return org;
}
使い方
function foo(options) {
options = setup_options(options, {
name : "default",
width: 128,
height: 128,
canHoge : false
});
}