イナヅマTVログ

JavaScript, Singleton Patternを作ってみた

| 1件のコメント

Classmethodさんのステキ記事、「ちょっと高度にJavaScript/クロージャの基礎

JavaScriptで関数や変数の隠匿には気をつかいますよね。
特に複数の人間が開発に携わっている時。
ほっとくとglobal領域を汚染したり上書きが発生したりとよろしくないことが発生しがちになります。

プロジェクトとして開発に同時参加なら規約など作って情報共有できたり、まずいことが見つかればお互いに連絡を取れたりするので人力でカバーすることも出来るのですが…

誰かが作ったJavaScriptで機能実装済みのHTMLファイルをわたされ、さらに別の機能を実装する時はそんな規約も連絡もありはしないので、さらに神経質にならないといけません。

名前空間を汚染しないように*即時関数にファイルを閉じ込めて作成します。
これは以前投稿している「名前空間の汚染問題を考える」当たりをご興味があればご覧下さい。

Classmethodさんの記事を見たからというわけでもないのですが、普段使っているオレオレJavaScript Singletonをご紹介しておきます。

PrivateなものとPublicなもの、Staticなものとインスタンス関数・変数を切り分けられるといいなーと思って作りました。

var Singleton = (function () {
	// ========================
	//	Private
	// ========================
	var privateVar1, privateVar2, instance;
 
	function privateMethod () {
	}
	// ========================
	//	Constructor
	// ========================
	function Singlton () {
		if (instance) {
			return instance;
		}
		instance = this;
 
		// ----[Public var]----
		this.someVar1 = '';
		this.someVar2 = 0;
		// ----[end of Public var]----
		return instance;
	}
	// ========================
	//	Public Static
	// ========================
	Singlton.getInstance = function () {
		if (!singleton) {
			instance = new Singleton();
		}
		return instance;
	};
	// ========================
	//	Public
	// ========================
	Singlton.prototype.publicFunc1 = function () {
 
	};
	Singlton.prototype.publicFunc2 = function () {
 
	};
	// ----[end of Singleton]----
	return Singleton
}());

Usage

var s1 = new Singleton();
var s2 = new Singleton();
var s3 = Singleton.getInstance();

こんな感じなんですけど、なんせオレオレなんでアドバイスなど頂けると助かります。
実際は上記コードを即時関数でさらにラップして使っています。

*即時関数

;(function () {
	//ここにコード
}());

こんな感じで作ります。
書いたところで即座に実行される関数になります。
即時関数内はローカルに扱いになるので名前空間を汚染しません。