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