JavaScriptのプライベート変数の作り方
JavaScriptを書き始める時に気になるもの、オイラの場合は名前空間。特にMozilla系アプリの拡張機能を作ろうとした時、他の拡張と被っていたらどうしよう...とビクビクしている。
ということで、一つのグローバルなオブジェクトを宣言してその中にオブジェクトを連ねる。
でも、その中には他から触られたくないプライベートな変数もある。
function Hoge(){ var hoge; this.setHoge = function(str){ hoge = str; return str; } } var foo = {}; foo.hogehoge = new Hoge();
とか何とかすれば、hoge変数はプライベートな変数となるわけだが、一つしか作る予定のないものにわざわざクラスを作ってnew
するのも面倒だし、グローバルな位置にHoge
関数が置かれてしまう。
で、苦肉の策でやってみたのが、これ。
var foo = {}; foo.hogehoge = (function(){ var hoge; return { setHoge = function(str){ hoge = str; return str; } }; }();
同じ要素を頻繁に使う場合、
var foo = {}; foo.hogehoge = function(str){ var elm = document.getElementById('bar'); elm.setAttribute('value', str); return str; }
とやるんじゃなくて、
var foo = {}; window.addEventListener('load',function(){ window.removeEventListener('load',arguments.callee,false); foo.hogehoge = (function(){ var elm = document.getElementById('bar'); return function(str){ elm.setAttribute('value', str); return str; } }(); },false);
とかやっておくとメソッドが呼ばれる度にdocument.getElementById
が呼ばれる事なしに、かつ、操作したい要素はプライベートで固定的に使える。
既に使い古されている書き方かもしれないけど、個人的には新発見だった。けど、バッドノウハウな気もするなぁ、コードが読み難くなるし。