Aelオブジェクト
Aelオブジェクトとは
Aelオブジェクトは一つの値を持つ変数オブジェクトです。以下の特徴があります。
- どんな型の値も持つことができる
- 予め型毎にaelプロパティを関連付けておくとAelオブジェクトから参照することができる
- 値は変更することができ、型が変わるとaelプロパティも切り替わる
値の型が変わるとAelオブジェクトが持つプロパティが切り替わるのは理解しづらいと思います。
次のコードは文字列と数値のaelプロパティを出力した例です。
// オブジェクトのプロパティ名を出力する関数を定義
var inspect = function(value){
var names = "";
for(var name in value)
names += name + "\n";
document.body.innerHTML += names;
}
window.onload = function(){
document.body.innerHTML += "■String型向けプロパティ\n";
var v = Ael("123");
inspect(v); // String型向けのプロパティが表示される
document.body.innerHTML += "■Number型向けプロパティ\n";
v._toNumber(); // 値をNumber型に変更する
inspect(v); // Number型向けのプロパティが表示される
}
使い方
Aelオブジェクトを作る
AelオブジェクトはAel関数に値を渡して生成します。
var aelObject = Ael("aiueo");
プロパティやメソッドを使う
プロパティを参照したりメソッドを呼び出す方法は変数と変わりません。
var v = Ael("123");
alert(v.trim); // プロパティ値を参照
v.trim(); // メソッド呼び出し
また等符号(=)でプロパティを持たせることもできます。この値は型が変わっても持ち続けるので注意してください。
例えば変更先のaelプロパティに同名のプロパティがあると直接代入したプロパティが優先されてしまい参照できません。。
var v = Ael(999); v.trim = "trim"; // trimプロパティに"trime"を代入 v._toString(); // 値を文字列へ変換 alert(v.trim); // "trim"と表示される。Stringクラスが持つtrimメソッドは参照できない
メソッドチェーンを繋げる
Aelオブジェクトから呼び出すメソッドは1つに対して戻り値の返し方が違う三つのメソッドを提供しています。
| XXXX | 戻り値をそのまま返す |
| _XXXX | 戻り値を自身(Aelオブジェクト)に設定して返す |
| $XXXX | 戻り値を破棄し、自身(Aelオブジェクト)を返す |
これを利用すると値に対する一連の処理をメソッドチェーンで繋げて表現することができ、コードの可読性を向上することができます。
次は「文字列の空白を取り除いて配列に変換した後、昇順に並び替える」処理をAelを使った場合と使わない場合で書いた例です。
// 変数
var v = " 1,a,2,b "
.trim() // "1,a,2,b"
.slice(); // ["1","a","2","b"]
v.sort(); // ["1","2","a","b"]
v.join(","); // "1,2,a,b"
// Aelオブジェクト
var a = Ael(" 1,a,2,b ")
._trim() // Ael<"1,a,2,b">
._slice() // Ael<["1","a","2","b"]>
.$sort() // Ael<["1","2","a","b"]>
.join(","); // "1,2,a,b"
記号により戻し方が違うのは直感的でないですが、これを見て読みやすいと思った場合は利用してみてください。
型やプロパティを追加する
Aelオブジェクトは型(クラス)やプロパティを外から追加することができます。詳細はチュートリアルの「クラス」を参照してください。
以下はAel.sample.Counterクラスを追加する例です。
// 型を追加する
Ael.package_("sample").class_("Counter", {
"instance num" : 0,
"prototype initialize" : function(increment){
this.incrementValue = Ael.isNumber(increment) ? increment : 1;
}
});
// 既存の型にプロパティを追加する
Ael(Ael.sample.Counter).properties({
"ael increment" : function(){
var v = this.val();
v.num += v.incrementValue;
}
});
window.onload = function(){
// 定義したメソッドを呼び出し、結果を出力する。
var v = new Ael.sample.Counter(2);
Ael(v)
.$increment() // 2
.increment(); // 4
document.body.innerHTML = v.num;
}