Na época em que estruturas JavaScript como MooTools e jQuery governou o país, todos nós escrevemos tutoriais que eram mais voltados para a estrutura em questão do que para o JavaScript comum. É triste, mas é verdade. Atualmente, evito publicações orientadas a frameworks, pois Node.js tomou conta do mundo, e os kits de ferramentas JavaScript vêm e vão.


Um post muito útil que escrevi e ainda adoro é Criar e recuperar objetos aninhados com o MooTools. Naquela postagem, mostrei como o senhor pode obter e definir facilmente objetos aninhados, já que fazer verificações de existência na cadeia de objetos de forma manual é… feio. Vamos tirar essa funcionalidade da orientação do MooTools para que o senhor possa levá-la para onde for!


O JavaScript


Usaremos uma função simples de execução imediata para envolver a função “worker” subjacente e retornar um objeto com propriedades para obter, definir e verificar a existência:



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;
		}
	};

})();


Então, como o senhor usaria esse conjunto de funções? Aqui estão alguns exemplos de uso:



// 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


Observe que eu não estendi o Object o senhor poderia, mas deixamos de lado essa prática.


Eu uso essas funções em praticamente todos os projetos em que trabalho. Acho que elas são muito úteis ao lidar com APIs, pois o senhor nunca pode presumir que existe uma cadeia de objetos. Gostaria de ter incluído esse código em meu 7 Funções essenciais do JavaScript post!