Skrytí vašich soukromí pomocí JavaScriptu

Věřte tomu nebo ne, existuje spousta lidí, kteří JavaScript silně nemají rádi. Z toho či onoho důvodu prostě nemohou vystát vnímaný nedostatek bezpečnosti a struktury v jazyce. Jednou z těchto vnímaných slabin je nedostatek soukromých označení proměnných v rámci struktur. Mají pravdu; pokud na objekt nalepíte vlastnost nebo vytvoříte d globální proměnné, je to férová hra pro každého. Existuje však několik velmi jednoduchých vzorů, které můžete v JavaScriptu použít k zachování soukromého přístupu k danému objektu nebo proměnné!

Pomocí "Třídy"

Pravděpodobně víte, že skutečné třídy v JavaScriptu neexistují, ale pomocí Function a prototypů je můžeme zatraceně dobře simulovat. Pomocí tohoto vzoru můžete také simulovat soukromé proměnné:

function MyClass(parameter) {
	
	// Create the private var
	var privateVar = 8,
		self = this;
	self.parameter = parameter
	
	// Function that handles the private
	function handlePrivate() {
		return privateVar ? privateVar-- :  false;
	}
	
	// Public method that calls the handler
	// Returns parameter until it's been accessed 8 times
	this.getPrivate() {
		return handlePrivate() ? self.parameter : null;
	}

}

Soukromé položky se vytvářejí v konstruktoru a pouze v konstruktoru. Přidáním privilegovaných metod v konstruktoru získáte přístup k privátům. Ve výše uvedeném příkladu je hodnota přístupná pouze pomocí privilegované metody.

S uzávěrkami

Vzor se soustředí kolem uzávěru s proměnnou s rozsahem a vrací objekt nebo funkci s přístupem k proměnné. Zde je jednoduchý příklad:

var accessor = (function() {
	// Create the private var
	var privateVar = "You Can't See Me, ";
	
	// Some other functionality here that periodically changes privateVar, because it has access to it
	// [ more code here ]
	
	// Return the accessor
	return function(name) {
		return privateVar + name;
	};
})();

// Use!
// currentValue = accessor("David");  "You Can't See Me, David"

Proměnná privateVar není k dispozici mimo uzávěrku, takže k ní není žádný přímý přístup. Máme však definovanou funkci s přístupem k proměnné a vracíme ji z uzávěrky. Proměnná tedy zůstává soukromá, můžete přistupovat k její hodnotě, ale není povolen žádný přímý přístup. Můžete také vrátit objekt s metodami pro úpravu chráněné proměnné:

var accessor = (function() {
	
	// The "private"
	var val = 9;
	
	// An object for getting and setting
	return {
		get: function() {
			return val * 3;
		},
		set: function(s) {
			val = s;
		}
	};
})();

Samozřejmě, s výše uvedeným vzorem by uživatel mohl změnit přiřazení metody get s něčím jako:

accessor = function(n) { return "My custom string, " + n; }

..tak si toho uvědomte. Obvykle jakákoli funkce, která zpracovává soukromé informace, zůstává v rámci uzavření, což zabraňuje problémům s metodami, které mají uživatele přednost. Něco takového:

var accessor = (function() {
	
	var permissions = {};
	
	function handleResult(perm) {
		// Do something with the result
	}
	
	return function(permissionToCheck, callback) {
		if(permissions[permissionToCheck]) != undefined) {
			callback(permissions[permissionToCheck]);
		}
		else {
			$.post({
				url: "/permissions"
				data: {
					perm: permissionToCheck
				}
			}).success(function(res) {
				callback(handleResult(res));
			});
		}
	};
	
})();

V jednoduchosti JavaScriptu je jistá krása; neodepisujte jej, protože neposkytuje stejné explicitní struktury jako jiné jazyky!