Namespaces

Varias librerías (ExtJS y YUI se me vienen a la cabeza) implementan funcionalidad específica para crear “namespaces” (que no es más que una cadena de objetos). La ventaja de usar esta metodología, es que permite asegurarnos de que el namespace a utilizar exista (si no existe, lo crea).

// declaramos el namespace
namespace("MyApp.utils.string");

// .. y sus metodos
MyApp.utils.string.trim = function(str) {
	// ...
}

namespace("MyApp.utils.math").cube = function(n) {
	return n * n * n;
};

MyApp.utils.math.cube(3);

Esto permite manejar de manera más prolija las estructuras de proyectos con varios archivos, permitiendo generar los namespaces en cada dependencia, asegurando su existencia al requerirlo.

Mi versión de esta funcionalidad:

/**
 * @author Aijoona
 * @param {String} path
 * @param {Object} root
 */
function namespace(path, root) {
	// valor por defecto
	root = root || this;

	var
		parts = path.split("."),
		l = parts.length,
		leaf; 

	for(i = 0; i < l; i++) {
		leaf = parts[i];

		if(!root[leaf]) {
			root[leaf] = {};
		}

		root = root[leaf]
	}

	return root;
}

A modo de breve manual, el segundo argumento indica desde donde debe crearse el namespace, como puede observarse en el siguiente ejemplo:

/*
 * Agregamos la funcion a un object
 */
var AIJOONA = {
    ns: namespace
};

AIJOONA.ns("utils"); // Crea AIJOONA.utils
AIJOONA.ns("$", window); // Crea la propiedad global $

var widget = {};
namespace("ui", widget); // Crea la propiedad ui dentro del object widget

Para mayor información puede consultar la documentación de las librerías mencionadas (ExtJS y YUI).



Discussion has just started! Join in...



Pings to this post

  1. […] ya un tiempo, publiqué este pequeño snippet de código para generar namespaces desde […]


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Comment

You may use these tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>