Získejte a nastavte vnořené objekty pomocí JavaScriptu

V době, kdy zemi vládly rámce JavaScript, jako jsou MooTools a jQuery, jsme všichni psali výukové programy, které byly koncipovány spíše k danému rámci namísto vanilkového JavaScriptu. Smutné ale pravdivé. V současné době se vyhýbám příspěvkům orientovaným na rámec, protože Node.js ovládlo svět a sady JavaScriptu přicházejí a odcházejí.

Jeden velmi užitečný příspěvek, který jsem napsal a stále miluji, je Vytváření a načítání vnořených objektů pomocí MooTools. V tomto příspěvku jsem vám ukázal, jak můžete snadno získat a nastavit vnořené objekty, protože provádět kontroly existence v řetězci objektů ručně je ... ošklivé. Pojďme tuto funkci vytrhnout z orientace MooTools, abyste si ji mohli vzít s sebou, kamkoli půjdete!

JavaScript

Použijeme jednoduchou okamžitě spouštěcí funkci k zabalení podkladové „pracovní“ funkce a vrátíme objekt s vlastnostmi pro získání, nastavení a kontrolu existence:

var Objectifier = (function() {

	// Utility method to get and set objects that may or may not exist
	var objectifier = function(splits, create, context) {
		var result = context || window;
		for(var i = 0, s; result && (s = splits[i]); i++) {
			result = (s in result ? result[s] : (create ? result[s] = {} : undefined));
		}
		return result;
	};

	return {
		// Creates an object if it doesn't already exist
		set: function(name, value, context) {
			var splits = name.split('.'), s = splits.pop(), result = objectifier(splits, true, context);
			return result && s ? (result[s] = value) : undefined;
		},
		get: function(name, create, context) {
			return objectifier(name.split('.'), create, context);
		},
		exists: function(name, context) {
			return this.get(name, false, context) !== undefined;
		}
	};

})();

Jak byste tedy tuto sadu funkcí používali? Zde je několik příkladů použití:

// Creates my.namespace.MyClass
Objectifier.set('my.namespace.MyClass', {
	name: 'David'
});
// my.namespace.MyClass.name = 'David'

// Creates some.existing.objecto.my.namespace.MyClass
Objectifier.set('my.namespace.MyClass', {
	name: 'David'
}, some.existing.objecto); // Has to be an existing object

// Get an object
Objectifier.get('my.namespace.MyClassToo');

// Try to find an object, create it if it doesn't exist
Objectifier.get('my.namespace.MyClassThree', true);

// Check for existence
Objectifier.exists('my.namespace.MyClassToo'); // returns TRUE or FALSE

Všimněte si, že jsem nerozšířil Object prototyp; můžete, ale od této praxe jsme přešli.

Tyto funkce používám téměř na každém projektu, na kterém pracuji. Považuji je za velmi užitečné při práci s API, protože nikdy nemůžete předpokládat, že existuje objektový řetězec. Přál bych si, abych tento kód zahrnul do svého příspěvku 7 základních funkcí JavaScriptu!