= Aelクラス(またはAel関数) = [[TOC(noheading, inline)]] == 説明 == このライブラリがグローバルオブジェクトに作成するプロパティで、次の役割があります。[[BR]] 1. Aelオブジェクトを生成する関数(「Ael関数」と呼称)。 1. Aelオブジェクトが提供する振る舞いのルートクラス。※1 1. Aelが提供する機能のルートクラス。※1 1. バージョンなどAel固有の情報や振る舞いを保持するコアオブジェクトを提供する特権関数。※2 ※1:用途は違うが1つのクラスであり、「Aelクラス」と呼称。[[BR]] ※2:内部的な役割のため詳細は省略。 === Aelオブジェクトを生成する関数 === 任意のオブジェクトを引数に渡して呼び出すと、オブジェクトの型に対応した振る舞いを持つAelオブジェクトを生成して返します。[[BR]] Aelオブジェクトとその使い方については「[wiki:tutorial_ael Aelオブジェクト]」を参照してください。 === Aelオブジェクトが提供する振る舞いのルートクラス === 「[wiki:tutorial_ael Aelオブジェクト]」の説明にある通り、Aelオブジェクトは振る舞いをプロトタイプチェーンにより構成します。Aelクラスはクラスツリーのルートクラスです。従って全てのAelオブジェクトはAelクラスの振る舞い(またはオーバーライドされた振る舞い)を持ちます。Aelクラスに振る舞いを追加したい場合は、Aelクラスを引数にAelオブジェクトを生成し、propertiesメソッドで追加してください。 {{{ #!html
// AelクラスにAelオブジェクトが持つ値をダイアログに表示する振る舞いを追加する
Ael(Ael).properties({
    "ael alert" : function(){	// aelキーワードを付与するとAelオブジェクトのメソッドとなる
        alert(this.val());
    }
});
}}} === Aelが提供する機能のルートクラス === Aelは機能をクラスで提供します。これらはAelクラスをルートクラスとしたクラスとパッケージの集合で構成されます。クラス、またはパッケージ配下にはクラスとパッケージをメンバとして含める事が可能です。[[BR]] 以下に例としてAelのクラスとパッケージの一部を示します。 {{{ Ael # ルートクラス +-- lang # lang パッケージ +-- Class # Class クラス +-- Property # Property クラス +-- Method # Method クラス(Propertyのサブクラス) }}} == 関数 == {{{ Ael([any value]) : object }}} * @version 0.2 * @param {any} [value] 値 * @return {object} Aelオブジェクト | {object} 内部オブジェクト 値の型に対応する振る舞いを持ったAelオブジェクトを生成して返す。[[BR]] 引数を指定しない場合は[wiki:Internals 内部オブジェクト]を返す。 == aelプロパティ == === apply === {{{ ael apply([object from...]) : object }}} * @version 0.2 * @param {object} from... コピー元 * @return {object} 値 引数のオブジェクトが持つプロパティを値へコピーする。 === clear === {{{ ael void clear() : void }}} * @version 0.4 オブジェクトが持つ全てのプロパティを削除する。 === clone === {{{ ael clone(boolean deep) : any }}} * @version 0.2 * @param {boolean} deep 深い複製を指示するフラグ(true - 深い) * @return {any} 複製した値 値の複製を生成して返す。[[BR]] 複製には浅い複製と深い複製があり、deepフラグにより切り替える。[[BR]] 二つの複製は次の共通した振る舞いをします。[[BR]] * 値型(typeof(x) == "number")と参照型(new Number(x))を区別して複製する。 * 無名関数の複製は二つの名前(""と"anonymous")を区別して複製する。 * toStringまたはvalueOf関数が置き換えられていた場合も正しく複製する。 * prototype値はプロトタイプチェーンにより複製する。 * ネイティブコードを含む関数は複製しないで複製元をそのまま返す。 * AIRは関数を複製しないで複製元をそのまま返す。[[BR]] (セキュリティによりeval関数とFunctionコンストラクタを使用できず、複製手段がない為) 上記の共通した振る舞いとは別に二つの複製には次の固有の振る舞いがあります。 ■浅い複製[[BR]] 値のみを複製する。値が所有するプロパティや配列に格納された値は複製せずにオリジナルを設定する(※for inで取得する値は複製しない意味)。そのため参照が指し示す値を変更するとオリジナルも変更される。 ■深い複製[[BR]] 値と値が所有するプロパティを再帰的に読み込んで複製する。配列に格納された値も複製される。再帰的な複製を行う為、複製量に比例して実行コスト、メモリを消費する。 最後にこのメソッドを使用する際は次の点に注意してください。[[BR]] * 別々のプロパティに納められた同じ参照値は違うものとして複製する。 * constructorプロパティの値を変更した場合、変更後の値で複製する。 * 関数を複製する場合、スコープ変数を再現して複製しない。 * NN4は無名関数の二つの名前(""と"anonymous")を区別して複製しない。 * NN4はtoStringまたはvalueOfメソッドが置き換えられていた場合に未定義エラーが発生する。[[BR]] (!ClosureインスタンスのtoString、valueOfメソッドを書き換えると他のClosureインスタンスが消滅する為) === compare === {{{ ael compare(any value2) : number }}} * @version 0.2 * @param {any} value2 値2 * @return {number} 0 - 二つ値が等しい場合、1 - 値2 > 値2の場合、-1 - 値2 < 値2の場合 二つの値の比較した結果を返す。[[BR]] Aelオブジェクトが持つ値を値1とし、引数を値2として比較を行う。値1と値2が等しい場合は 0 を返し、値1 > 値2の場合は 1 を返す。値1 < 値2の場合は -1 を返す。 比較は次の順序で行われる。 1. typeof演算子の結果を辞書順に比較。※ 1. 値がオブジェクトの場合、2-1から2-2までの比較を行う。 1. 値の何れかにnullが含まれる場合、null < not nullのルールで比較する。 1. コンストラクタで比較する。 1. 値が関数の場合、3-1の比較を行う。 1. 関数の文字列表現で辞書順に比較する。 1. 値を比較演算子(<>)で比較。 比較演算子は値が数値の場合(typeof(x) == "number")は数値比較を行い。 値が文字列の場合(typeof(x) == "string")は辞書比較を行う。 また、値が真偽値の場合(typeof(x) == "boolean")はfalse < trueのルールで比較する。 値がそれ以外の文字列表現を行えるデータ型の場合(typeof(x) == "object" or typeof(x) == "function")は 文字列表現で辞書比較を行う。 値がそれ以外の場合(null or typeof(x) == "undefined")は比較結果は全て偽となる。 ※typeof演算子結果の順序[[BR]] boolean < function < number < object < string < undefined === copy === {{{ ael copy() : object }}} * @version 0.2 * @return {object} 生成したAelオブジェクト 同じ値を持つ新しいAelオブジェクトを生成して返す。 === equals === {{{ ael equals(any value2) : boolean }}} * @version 0.2 * @param {any} value2 値 * @return {boolean} true - 二つの値が等しい場合 Aelオブジェクトが持つ値と引数の値が等しい場合は true を返す。[[BR]] 二つの値が等しい(値1 === 値2)場合は true を返す。 言語仕様ではNaN同士の比較は"等しくない"となるが、この関数は等しいと判断する。 === each === {{{ ael each(function fn) : void }}} * @version 0.2 * @param {function} fn 関数 Aelオブジェクトの値が持つプロパティ毎に関数を呼び出す。[[BR]] 関数の引数にはプロパティ値、インデックス(0 始まり)、キー名を渡す。[[BR]] 関数から未定義値以外が返された場合、関数の呼び出しを止めて復帰する。 === hasOwn === {{{ ael hasOwn(string name) : boolean }}} * @version 0.2 * @param {string} name プロパティ名 * @return {boolean} true - 値がプロパティを有している場合 値が指定されたプロパティを有している場合は true を返す。[[BR]] このメソッドはhasOwnProperty関数の独自実装で、実行環境にhasOwnProperty関数が存在する場合はそちらを利用し、存在しない場合は独自実装によりhasOwnProperty関数と同じ振る舞いをする。しかし、次の点のみhasOwnProperty関数と振る舞いが異なる。 * IE5.5未満において「f.prototype = {aiueo : void 0}」などのようにprototypeプロパティを置き換える方法で設定されたプロパティに対しては、正しい結果を返すことができない。hasOwnProperty関数は偽を返すが、このメソッドは true を返す。なおNN4では「f.prototype = {aiueo : void 0}」の振る舞いが異なる為、この事象は発生しない。 * 一部のブラウザは文字列を文字配列の様に扱い、for inやhasOwnProperty関数で添え字をプロパティとして返すが、このメソッドは文字列配列として扱わない。 === keys === {{{ ael keys() : Array }}} * @version 0.2 * @return {Array} キー名リスト 値が持つプロパティのキー名を配列で返す。 === toArray === {{{ ael toArray([boolean include]) : Array }}} * @version 0.3 * @param {boolean} [include] 値がArray型以外の場合に新しい配列へ値の追加を指示するフラグ(デフォルト:false) * @return {Array} 配列 Aelオブジェクトが持つ値を配列に変換して返す。[[BR]] 値がArray型の場合は全ての値をコピーした新しい配列を生成して返す。値がそれ以外の場合、includeに true を指定した場合は値をセットした新しい配列を生成して返す。未指定の場合は空の配列を生成して返す。 === toBoolean === {{{ ael toBoolean() : boolean }}} * @version 0.3 * @return {boolean} 真偽値 Aelオブジェクトが持つ値を真偽値に変換して返す。[[BR]] Boolean型への変換ルールはECMAScript 3rdの型変換仕様に準ずる。 === toJSONString === {{{ ael toJSONString([boolean partial]) : string }}} * @version 0.2 * @param {boolean} [partial] RFCに定められた最低限のエスケープを指示するフラグ(デフォルト:false) * @return {string} JSON形式文字列 Aelオブジェクトの値をJSON形式の文字列へ変換して返す。[[BR]] JSON文字列への変換はRFC 4627に基づいて行う。この関数はデフォルトで文字列値に対して制御文字を除いた全ての文字をUnicodeエスケープ(\uXXXX)する。これは各ブラウザの!JavaScriptインタプリタが、それぞれ特定の文字を読み落としてしまう問題を自然に回避する為である。Unicodeエスケープを行いたくない場合はpartial引数に true を指定することで無効にできる。 === toNumber === {{{ ael toNumber() : number }}} * @version 0.3 * @return {number} 数値 Aelオブジェクトが持つ値を数値に変換して返す。[[BR]] Number型への変換ルールはECMAScript 3rdの型変換仕様に準ずる。 === toString === {{{ ael toString() : string }}} * @version 0.3 * @return {string} 文字列 Aelオブジェクトが持つ値を文字列に変換して返す。[[BR]] String型への変換ルールはECMAScript 3rdの型変換仕様に準ずる。 == prototypeプロパティ == === val === {{{ prototype val() : any }}} * @version 0.3 * @return {any} オブジェクト自身を返す。 オブジェクト自身を返す。[[BR]] このメソッドはaelメソッドとprototypeメソッド内で、処理対象の値の取得方法を共通化させる事を目的としている。例えば次のようなAel.sample.Counterクラスがあったとして、valメソッドがない場合では冗長になってしまうincrementメソッドの定義が、valメソッドがあることで冗長さを無くすことができる。 {{{ #!html
//valメソッドがない場合
Ael.package_("sample").class_("Counter", {
    "instance count" : 0,
    
    "ael increment" : function(){
        this.val().count++;
    },

    "prototype increment" : function(){
        this.count++;
    }
});

//valメソッドがある場合
Ael.package_("sample").class_("Counter", {
    "instance count" : 0,
    
    "ael prototype increment" : function(){
        this.val().count++;
    }
});
}}} == staticプロパティ == === class_ === {{{ static class_(string name|object option[, object... properties) : function }}} * @version 0.1 * @param {string|object} name クラス名|option オプション * @parem {object} properties プロパティ定義 * @return {function} クラス クラスを作成する。[[BR]] 第一引数にオプションを指定することで手軽にカスタマイズできます。 ||名称||型||初期値||説明|| ||name||string||(必須)||クラス名|| ||type||any||(作成したクラス)||Aelオブジェクトで値とバインドする型。|| ||aliases||Array||[]||typeを複数指定する場合はaliasesで指定する。|| [[BR]] === instanceOf === {{{ static instanceOf(any value[, object clazz...]) : boolean }}} * @version 0.1 * @param {any} value 値 * @param {object} clazz クラス * @return {boolean} true - 値が指定されたクラスのインスタンスの場合 値が指定されたクラスのインスタンスの場合は true を返す。[[BR]] このメソッドはinstanceof演算子が実装されていない古い!JavaScript実装での動作を目的とした代替実装で、判定には値のconstructorプロパティを用いる。constructorプロパティはnullと未定義値以外に存在し、その値を生成したクラス(関数)が格納されている。インスタンスのconstructorプロパティは関数以外の値にも置き換えられるため、第二引数のクラスは関数以外も許容する。[[BR]] なお、instanceof演算子とこのメソッドは同等ではない。例えば特定のプリミティブ値(boolean型、number型、string型)やconstructorプロパティを置き換えたオブジェクトを比較した場合、instanceof演算子は false を返すが、instanceOfメソッドは true を返す。 {{{ #!html
alert( "a" instanceof String );							// false
var value = {constructor : Ael.sample.Counter};
alert( value instanceof Ael.sample.Counter );			// false

alert( Ael.instanceOf("a", String) );					// true
alert( Ael.instanceOf(object, Ael.sample.Counter) );	// true
}}} 二つの結果が違う原因はinstanceOfメソッドはconstructorプロパティで型を判断するのに対し、instanceof演算子は内部で持つ本当の型情報で判断するからです。従ってこのメソッドで判別する場合はconstructorプロパティを書き換えると型を偽装することが可能ですが、instanceof演算子ではできません。 === isObject === {{{ static isObject(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値がオブジェクトの場合 値がオブジェクトの場合は true を返す。[[BR]] このメソッドがオブジェクトと判別する値はプロパティを持つ事ができ、関数の引数に指定した場合は参照渡しとなる値です。従って関数は true を返し、プリミティブ値や未定義値、nullは false を返す。 {{{ #!html
オブジェクト
(true を返す)
{}
[]
new Boolean(false)
new Number(1)
new Number(NaN)
new String("a")
function(){}
new Function()
 
プリミティブ
(false を返す)
true
1
"a"
NaN
null
void 0
}}} このメソッドは次のコードと等しい。 {{{ #!html
value !== null && (typeof value === "object" || typeof value === "function");
}}} === isBoolean === {{{ static isBoolean(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が真偽型の場合 値がBoolean型の場合は true を返す。[[BR]] この関数は値がプリミティブ、オブジェクト問わず真偽型であれば true を返す。 === isNumber === {{{ static isNumber(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が数値型の場合 値がNumber型の場合は true を返す。[[BR]] この関数は値がプリミティブ、オブジェクト問わず数値型であれば true を返す。 === isString === {{{ static isString(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が文字列型の場合 値がString型の場合は true を返す。[[BR]] この関数は値がプリミティブ、オブジェクト問わず文字列型であれば true を返す。 === isFunction === {{{ static isFunction(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が関数、または無名関数の場合 値が関数(無名関数を含む)の場合は true を返す。[[BR]] 型の判定にはtypeof演算子を用いており、このメソッドは次のコードと等しい。 {{{ #!html
typeof(value) === "function"
}}} === isNative === {{{ static isNative(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値がネイティブコードを含む関数の場合 値がネイティブコードを含む関数の場合は true を返す。[[BR]] 判定は関数の文字列表現に"[native code"が含まれるか、または"[function]"と完全一致するかで行う。"[native code]"で判別しない理由はRhinoの文字列表現(例:"[native code for Function.Function, arity=1]")に対応する為で、"[function]"もKJSの古いバージョンに対応する為です。 === isArray === {{{ static isArray(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が配列系オブジェクトの場合 値がArrayオブジェクト、またはArgumentsオブジェクトの場合は true を返す。 === isArguments === {{{ static isArguments(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が引数オブジェクトの場合 値がArgumentsオブジェクトの場合は true を返す。[[BR]] ECMAScriptの仕様ではObjectオブジェクトにcalleeとlengthプロパティを付与したものとされていることから、判定はクラスと二つのプロパティの有無で行う。値がObjectオブジェクトであり、プロパティが両方ともを存在する場合は true を返し、それ以外は false を返す。また、Operaの引数はArrayオブジェクトであるのでArrayオブジェクトも許容する。 === isNull === {{{ static isNull(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値がnullの場合 値がnullの場合は true を返す。 === isUndefined === {{{ static isUndefined(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が未定義値(void 0)の場合 値が未定義値(void 0)の場合は true を返す。 === isNaN === {{{ static isNaN(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値がNaN値の場合 値がNaN値の場合は true を返す。[[BR]] 組み込み関数のisNaNは未定義値だと true を返すが、このメソッドはNaN値のみ true を返す。 === isNoU === {{{ static isNoU(any value) : boolean }}} * @version 0.1 * @param {any} value 値 * @return {boolean} true - 値が未定義値、またはnullの場合 値がnull、または未定義値の場合は true を返す。 === namespace === {{{ static namespace() : function }}} * @version 0.4 簡易名前空間(Aelの複製)を作成して返す。 === package_ === {{{ static package_(string name|object option) : object }}} * @version 0.1 * @param {string|object} name パッケージ名|option オプション * @return {object} パッケージ パッケージを作成する。 === parent === {{{ static parent() : object|function }}} * @version 0.1 * @return {object|function} パッケージまたはクラス 上位パッケージまたは上位クラスを返す。