ホーム >> 左脳Script >> Java Script >> クラス内で唯一の共通プロパティ

クラス内で唯一の共通プロパティ


よく、クラス内で唯一の共通プロパティを作って、インスタンスを管理するような記述をするのですが、これが Java Script で出来るのかどうか、調査してみることにしました。

C++ とかAction Script とかで自分がよくやるコード。VBでも似たような事をした覚えがあります。
この例では、Action Script っぽく書いています。

class   hoge
{
    private static  baseArray:Array =   new Array();
    //
    public hoge()   //  コンストラクタ
    {
        baseArray.push(this);
    }
    //  兄弟何人?
    public HowManyBrothers():int
    {
        return  baseArray.length;
    }
}
外からは、インスタンスの配列は触れないので「クラス内で制御を完結させる場合に便利。」だと思っているのですが。


Java Script でコレを実現するには?

その1:インスタンス作成の数をカウントしてみる。

var hogegege    =   function()
{
    this.count++;
    this.alert  =   function(){ alert(this.count);  };
};
hogegege.prototype.count    =   0;

var hoge1   =   new hogegege(1);
var hoge2   =   new hogegege(2);
var hoge3   =   new hogegege(3);

hoge3.alert();
結果は「1」。

プロトタイプで指定した0からカウントを始めはするのですが、カウントアップした後の変数がインスタンスの方に保存される為に、幾つインスタンスを作っても1になるようです。
予想通りの結果。



その2:インスタンスを配列に追加してみる。

var hogegege    =   function()
{
    this.count.push(this);
    this.alert  =   function(){ alert(this.count.length);   };
};
hogegege.prototype.count    =   new Array();

var hoge1   =   new hogegege(1);
var hoge2   =   new hogegege(2);
var hoge3   =   new hogegege(3);

hoge3.alert();
結果は「3」。

「配列が参照渡しである」という特性を上手く利用できているようです。
機能はアッサリと実現出来たようですが、この prototype の記述を、クラス宣言?のコード内に収める事は出来ないのでしょうか?
出来れば、クロージャのように、外からその存在を検知できない形にしたいところ。



その3:クロージャを無理やり使ってみる。

var hogegege    =   (function()
{
    var innerArray  =   new Array();
    return  function()
    {
        innerArray.push(this);
        this.alert  =   function(){ alert(innerArray.length);   };
    };
})();

var hoge1   =   new hogegege(1);
var hoge2   =   new hogegege(2);
var hoge3   =   new hogegege(3);

hoge3.alert();
結果は「3」。

記述が面倒ですが、やりたかった事に相当近づいてきました。
prototype 記述のように、参照渡しに頼らなくても行けそうですね。

しかし、懸念もあります。
インスタンス作成時に関数オブジェクトを新たに作成し、それをプロトタイプとする為、 インスタンスの数だけプロトタイプが作られ、メモリ効率が悪い事でしょうか。 プロトタイプが全て別になると言う事は、インスタンスが多量になった場合、 同じ様なものが多量にメモリに配置され、キャッシュが効きにくくなると言うことです。

粒度の小さいクラスで多量にインスタンスを作成しなければならないような場合、 この方法はお勧めできない事になります。



考察と言うか(個人的)結論

今のJava Script の仕様から言って、あらゆる?観点から無理をしない妥協案である、その2の方法が最も妥当であると判断しました。個人的に。

というか、その3の方法で、メモリコスト等から、たとえ間接的にであっても速度が低下する可能性がある場合、この方法を取るべきではないと考えました。


クラス内で唯一のプロパティ作成法の例は以下。

var hogegege    =   function()
{
    this.staticObject.instanceArray.push(this);
    this.staticObject.hogehogeCounter++;
    this.alert  =   function(){ alert(this.staticObject.hogehogeCounter);   };
};
hogegege.prototype.staticObject =
{   //  クラスで管理するプロパティを好きなだけ列挙
        instanceArray:(new Array())
    ,   hogehogeCounter:0
};
Object 等、参照渡しで管理できる物ならなんでも利用可能です。Object が使い勝手が良いでしょう。
ココまできたら、もぅ普通にグローバル変数でも良いっちゃ良いのですが、わざわざ prototype を使う事によって、製作者側、利用者側双方に意識させる狙いがあります。



参考リンク




トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/187

コメントする

ホーム >> 左脳Script >> Java Script >> クラス内で唯一の共通プロパティ

アーカイブ

このブログ記事について

このページは、n-yagiが2009年7月 4日 17:54に書いたブログ記事です。

ひとつ前のブログ記事は「boidデモの記事」です。

次のブログ記事は「エレメントの座標取得 ~高速化断念無念orz~」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。