* シングルトンパターン(アクセス権付きで) [#ib951481]
** オブジェクトを定義する [#pc722855]
var Singleton = (function(){
var instance;
function init() {
var foo = 'FOO';
var bar = 'BAR';
var getFoo = function () { return this.foo; };
var getBar = function () { return bar; };
var _getBaz = function () { return 'BAZ' };
return {
foo: foo,
getFoo: getFoo,
getBar: getBar,
getBaz: _getBaz
};
}
return {
getInstance: function () {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
** オブジェクトを利用する [#h23ce356]
var obj = Singleton.getInstance();
console.log('DEBUG: ' + obj.getFoo()); // getFoo()は公開メソッド。
console.log('DEBUG: ' + obj.getBar()); // getBar()も公開メソッド。
obj.foo = 'FOO2'; // fooはパブリックプロパティなので、
console.log('DEBUG: ' + obj.getFoo()); // "FOO2"に変わってる。
obj.bar = 'BAR2'; // barはプライベートプロパティなので、
console.log('DEBUG: ' + obj.getBar()); // "BAR"のまま。
console.log('DEBUG: ' + obj.getBaz()); // getBaz()は内部でプライベートメソッド_getBaz()を呼んでいる。
var obj2 = Singleton.getInstance(); // シングルトンなので、
console.log('DEBUG: ' + obj2.getFoo()); // obj2のfooプロパティは"FOO2"になっている。
obj2.foo = "FOO3"; // obj2のfooを変えると、
console.log('DEBUG: ' + obj.getFoo()); // objのfooは"FOO3"になっている。
DEBUG: FOO
DEBUG: BAR
DEBUG: FOO2
DEBUG: BAR
DEBUG: BAZ
DEBUG: FOO2
DEBUG: FOO3
** 参考 [#g073dfc3]
http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/