Born Too Late

Yuya's old tech blog.

JavaScript で private なインスタンス変数 (のようなもの) を作る

2010-04-13 14:13:44

通勤電車の中で思いついたコードを、昼休みを利用して書いてみました。動いたので公開。ただし、バッドノウハウなので要注意。

解説

まず、クロージャを利用して、外からは見えない privateNameSpace という名前空間を作ります。この privateNameSpace 自体は、言わば private static なものなので、Dog オブジェクトが個別に持つものではなく、Dog クラスに紐づく (ように見える) 空間です。

これを、各インスタンス毎に分けて使えるよう、Dog コンストラクタで objectId というメンバ (これは public) を作っています。objectId は、ミリ秒単位の時間と、乱数を文字列として結合したもので、およそユニークであることが期待されています。とはいえ、理論上は衝突の可能性もあり得るのですが・・・。

この objectId をキーに、privateNameSpace の中に、連想配列オブジェクトを作れば、インスタンスごとに private な名前空間を持つことができる、というわけです。

2 番目のコードを動かしてみると、何となくそれらしく動いていることが確認できます。

ただ、大きな問題は、objectId を乗っ取ることができてしまうということです。3 番目のコードのようにすることで、もともとは pochi オブジェクトだったものが、あたかも taro オブジェクトであるかのように振舞うようになってしまいます。

まとめ

上記の問題の他にも、メンバの取得のための記述が煩雑なところも大きな問題と言えます。もう少し抽象化できれば書きやすくなるかもしれませんが、いずれにせよ、実用的な方法では無いでしょう。

似たようなことを実現するためのノウハウはネット上にいろいろ転がっているようなので、そちらも読んでみたいと思った次第です。

あとで読む