use private function / property in prototype

ふと思ったのでメモ。

function Hoge() { this.init.apply(this, arguments); }
Hoge.prototype = (function(){
  /*
   * Private functions
   */
  function foo(arg){
    // ....
  }
  /*
   * Public Methods/Properties
   */
  var pub = {
    init: function(name){
      // ...
    },
    bar: function(arg){
      foo(arg);
      // ...
    }
  };
  return pub;
})();

としておくと、プライベートな関数をprototype内から使える。ただし、prototype内はインスタンスに共有されるので、変数を入れておくと後で痛い目に会いそう。逆に共有されることが分かっていれば有用にも使えそうだ。

もう少し考えてみる。

function Hoge(){
  var name;
  function Obj(args){ this.init.apply(this, args); }
  Obj.prototype = (function(){
    // shared valiables
    var CLASSNAME = "Hoge";
    // public methods/properties
    var pub = {
      init: function(aName){
        name = aName;
      },
      get NAME(){ return name; },
      get CLASS(){ return CLASSNAME; }
    };
    return pub;
  })();
  return new Obj(arguments);
}

としておけば、

var foo = new Hoge("foo");
var bar = new Hoge("bar");
foo.NAME; // "foo"
bar.NAME; // "bar"

とできる。これでプライベートな変数も関数も扱える。
ただまぁ、歪な構造というか、格好悪いというか、変態チックだなぁ。