Objectの長さを取得する(Objectの拡張)
今回は意外と活用の機会の多い、Objectの長さを取得するという事を題材にします。
Flashは、Arrayの長さをはかるlengthという関数はあるのですが、Objectの長さをはかる関数はありません。
Objectは、for inを利用すれば長さを取得出来ますので、実装の際は以下のような方法が挙げられます。
- (1)Objectの長さを返す関数を用意する(引数にObjectを渡す)
- (2)Objectクラスを拡張する
今回は、(2)の方法で、Object.length();のように簡単に取得出来るようにしてみました。
コードの途中、typeofでfunctionを省いているのは、拡張したlengthという関数を対象から省く為です。
/** @description Objectの長さを取得して返します */ Object.prototype.length = function():Number { var i:Number = 0; for (var prop in this) { if (typeof (this[prop]) != "function") i++; } return i; }; var obj:Object = {a:1, b:2}; trace("Objectの長さ : "+obj.length());
意外と細かな拡張の可能なFlash。こういう利便性を挙げる拡張は楽しいですね。(Object.lengthは、ビルドイン希望です^^;)
■追記(06/10/30)
ASSetPropFlagsというドキュメントに載っていないActionScriptを利用すると、特定のObjectの列挙を防ぐ事が可能です。
上記のものをASSetPropFlagsを利用して書き換えてみます。
/** @description Objectの長さを取得して返します */ Object.prototype.length = function():Number { ASSetPropFlags(Object.prototype, "length", parseInt("111", 2), 1); var i:Number = 0; for (var prop in this) { i++; } return i; }; b = {a:1, b:2}; trace("Objectの長さ : "+b.length());
ASSetPropFlagsなどドキュメントに載っていないActionScriptに関しては、以下のFLASH HACKS(O'REILLY)に詳しく載っています。面白いので、ぜひ手に取ってみて下さい。