prototype.jsでstatic変数を書く

間違ってたら指摘よろしく。原理的にはprototype.jsに限った話ではないけれど、判りやすいのでprototype.jsの例で。
JavaScriptでstaticな変数を書くときの話。とりあえずインスタンス変数を書くときの例から。

var Hatena = Class.create();
Hatena.prototype = {
cto: 'naoya',
initialize: function() {}
}
var jnaoya = new Hatena();
var jmala = new Hatena();
jnaoya.cto = 'reikon';
alert(jnaoya.cto);
alert(jmala.cto);

これを実行すると、

reikon
naoya

となる。jnaoyaインスタンスに対してのみ、ctoに’reikon’が代入されているためだ。これで問題ないことが多いのだけど、たまにstaticな変数が欲しい場合がある。上記の例だと、jmalaのctoも’reikon’にしてくれよって感じのとき。そこでこう書く。

var Hatena = Class.create();
Hatena.prototype = {
staff: {'cto':'naoya'},
initialize: function() {}
}
var jnaoya = new Hatena();
var jmala = new Hatena();
jnaoya.staff['cto'] = 'reikon';
alert(jnaoya.staff['cto']);
alert(jmala.staff['cto']);

これで、jnaoyaもjmalaもctoはめでたく’reikon’となる。じゃあ、逆にオブジェクトだけどstaticにしたくない場合はどうするのか。そのときはこう書く。

var Hatena = Class.create();
Hatena.prototype = {
staff: null,
initialize: function() {
this.staff = {'cto':'naoya'};
}
}
var jnaoya = new Hatena();
var jmala = new Hatena();
jnaoya.staff['cto'] = 'reikon';
alert(jnaoya.staff['cto']);
alert(jmala.staff['cto']);

これの結果は最初と同じく、

reikon
naoya

となる。
なんでそうなるのかって話だけど、一つ目と三つ目はプロパティ自体を置き換えているけれど、二つ目はプロパティまで参照した上で中身だけを置き換えているために、こういう挙動になるのかなと理解している。
という訳で突っ込みどころ満載な予感。

2件のコメント

  1. static なら、そもそも new する必要はなく
    Hatena.staff でアクセスできないとダメなのでは?

    と思いました。

    文句だけ言って、解決策も考えず申し訳ございません。m(_ _)m

  2. JavaScript自体がstaticをサポートしていないのであれば、という前提のもとでのstatic変数ですね。Hatena.staffとアクセスできればきれいですが、解決策が思いつきません。

コメントする

メールアドレスが公開されることはありません。