El caso es el siguiente: Tenemos un objeto al que queremos crearle propiedades anidadas pero nos gustaría no tener que preocuparnos de si sus parent existen. por ejemplo, si tuviera un objeto “miObjeto” y quisiera crearle una función en miObjeto.modulos.ctools.watcher, primero tendría que crear ese path. eso o podemos usar esta función:
/**
* Genera propiedades de un objeto (JSON) dinamicamente.
* @returns objeto extendido.
*/
function extend(base, ns_string) {
var parts = ns_string.split('.'),
pl, i;
pl = parts.length;
for (i = 0; i < pl; i++) {
//create a property if it doesnt exist
if (typeof base[parts[i]] == 'undefined') {
base[parts[i]] = {};
}
base = base[parts[i]];
}
return base;
}
Y listo, ya podemos extender nuestro objeto de forma dinámica:
var miObjeto = {};
//console.log("Esto va a dar error porque 'modulos.ctools.watcher' no existe");
//console.log(miObjeto.modulos.ctools);
extend(miObjeto, 'modulos.ctools.watcher');
extend(miObjeto, 'settings.general');
miObjeto.modulos.ctools.watcher = function () {
console.log("Soy una función!");
};
console.log(miObjeto);
Resultado:
Chau!