Na época em que frameworks de JavaScript como MooTools e jQuery reinavam na terra, todos nós escrevemos tutoriais que trabalhavam mais o framework do que o JavaScript em si. Triste, mas verdade. Atualmente, eu evito artigos orientados a frameworks desde que o Node.JS dominou o mundo e kits de ferramentas JavaScript vêm e vão.
Um artigo muito útil que eu escrevi ,e ainda é muito útil, foi sobre criar e alterar objetos aninhados com MooTools. Nesse artigo, eu mostrei como você pode facilmente fazer o get e o set de objetos aninhados, já que fazer verificações de existência em uma cadeia de objeto de forma manual é… feio. Vamos deixar de usar essa funcionalidade apenas com o MooTools, então você poderá usar em qualquer lugar, aonde quer que vá!
O JavaScript
Usaremos uma função simples de execução imediata para fazer um wrap na função “worker” e retornar um objeto com propriedades para fazer get, set e check 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 você 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 não fiz um extend no Object prototype; é possível fazer isso, mas optamos por não fazer aqui.
Eu uso essas funções em praticamente todo projeto em que trabalho. Eu as acho muito úteis ao lidar com APIs, já que você nunca pode presumir que exista uma cadeia de objetos. Quisera eu ter incluído esse código no meu artigo de funções essenciais de JavaScript 7!
***
David Walsh faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://davidwalsh.Name/Nested-Objects