Escrevendo uma Classe Singleton no Javascript

Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.

Veja como criar uma classe Singleton no Javascript!

Muitas pessoas tem dúvidas de como criar uma classe com o padrão Singleton no Javascript, então vou lhe mostrar como pode ser feito:

Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.

fonte: wikipedia
/*
    A Singleton Pattern Class
	
	Singleton pattern is a design pattern that is used to restrict instantiation of a class to one object (an implementation of the mathematical concept of singleton)
	
	Thnx for ready,
	Lucas Martins at lucasmartins.com.br
	
*/

function Users() {
	var names = [],
	proto = arguments.callee.prototype;
	
	if (!proto._initiated){
		proto.add = function(name) {
			names.push(name);
			return this.names();
		};
		proto.names = function() {
			return names;
		};
		proto._initiated = true;
	}
	return this;
}

Exemplo de uso:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Exemplo de uma classe Singleton no Javascript</title>
<script type="text/javascript" src="users.js"></script>
<script type="text/javascript">
Enterprise = (function() {
	var container = null;
	
	return {
		el: function(element) {
			if (element) container = element;
			if (container == null) container = document.getElementById('container');
			if (container.length == 0) document.body;
			return container;
		},
		writeLine: function(args, e) {
			var line = null;
			line = document.createElement("div");
			line.innerHTML = args;
			this.el().appendChild(line);
		}
	}
})();

function run() {
	Enterprise.container = 'container';
	// Add user
	var user1 = new Users();
	user1.add("Lucas Martins");
	
	Enterprise.writeLine(user1.names().length == 1 ? "contém 1 usuário: " + user1.names().toString() : '');
	
	// Use another instance
	var user2 = new Users();
	Enterprise.writeLine(user2.names().length == 1 ? "contém 1 usuário adicionado em user1: " + user2.names().toString() : '');
	
	// Add another cat in the other instance
	user2.add("Patty");
	Enterprise.writeLine(user2.names().length == 2 ? "contém 2 usuários: " + user2.names().toString() : '');
	Enterprise.writeLine(user2.names().length == 2 ? "qualquer instância conterá esses 2 usuários: " + user1.names().toString() : '');
}
</script>
</head>

<body>
<button onclick="javascript: run();">run</button>
<div id="container"></div>
</body>
</html>

Saída:

contém 1 usuário: Lucas Martins
contém 1 usuário adicionado em user1: Lucas Martins
contém 2 usuários: Lucas Martins,Patty
qualquer instância conterá esses 2 usuários: Lucas Martins,Patty