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!