移転しました。

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

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