¿Cómo abarcar el espacio de nombres javascript en múltiples archivos?

He ignorado javascript para siempre. Comencé a usar jQuery hace unos años para poder sobrevivir. Pero a medida que empecé a hacer más TDD, decidí ayer sumergirme realmente en javascript (y posiblemente en un coffeescript después de eso).

En mi aplicación ASP.NET Web Forms tengo muchas páginas y actualmente la mayoría de esas páginas no tienen una tonelada de javascript. Estoy en el proceso de cambiar eso. Estoy usando Jasmine con Chutzpah para crear mis pruebas.

Me estaba moviendo junto con mis pruebas pasando y fallando como se esperaba. Pero luego quise crear un espacio de nombres para no pisotear todo el espacio global.

Después de leer este artículo:http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/

Decidí probar y usar el patrón de la sección Función anónima autoejecutable: Parte 2 (Pública y privada) del artículo. Parece tener la mayor flexibilidad y parece encapsular las cosas muy bien.

Tengo una carpeta llamada / Scripts. Debajo de esa carpeta están algunos de los marcos que estoy usando como jQuery, jasmine, (twitter) bootstrap y modernizr. También tengo una subcarpeta llamada / Sitio donde coloco mi código para el sitio en varios archivos según la página. (product.js, billing.js, etc.)

En / Scripts / Site agregué una subcarpeta a / Tests (o Specs) que tiene los archivos (product_test.js, billing_tests.js, etc.).

Sin tener espacios de nombres todo está bien. Tengo un archivo utility.js que creé con unpadLeft Función auxiliar. Luego utilicé ese padLeft global en otro archivo .js. Todas mis pruebas funcionaron y estaba feliz. Entonces decidí averiguar el espacio de nombres y cambié mis Scripts / Site / utility.js para que pareciera:

<code>(function (myns, $, undefined) {
    //private property
    var isSomething = true;

    //public property
    myns.something = "something";

    //public method
    myns.padLeft = function (str, len, pad) {
        str = Array(len + 1 - str.length).join(pad) + str;

        return str;
    };


    //check to see if myns exists in global space
    //if not, assign it a new Object Literal
}(window.myns= window.myns|| {}, jQuery ));
</code>

Luego en mi Scripts / Sitio / Pruebas / utility_test.js tengo

<code>/// <reference path="../utility.js" />

describe("Namespace myns with public property something", function () {
    it("Should Equal 'something'", function () {
        expect(myns.something).toEqual('something');
    });
});
</code>

Con esta prueba extremadamente simple esperaba que myns. algo regresara con el valor de cadena de "algo".

No lo hace Vuelveindefinido.

Entonces, ¿cómo puedo usar el espacio de nombres de javascript en varios archivos?

Lo siento por la larga introducción, pero pensé que podría ayudar a explicar lapor qué de mí haciéndolo de esta manera. También pongo todo esto porque estoy abierto a escuchar ideas sobre cómo esta configuración es totalmente incorrecta o parcialmente incorrecta o lo que sea.

Gracias por tomarse el tiempo para leer esta pregunta.

ACTUALIZACIÓN: RESUELTOS Gracias por toda tu ayuda. La mayor ayuda provino del comentarista @ T.J. Crowder. No sabía que existía la herramienta jsbin y, después de convencerme de que el código que escribí anteriormente se incluyó en la herramienta y los resultados fueron correctos, supe que algo tenía que estar apagado en mi entorno.

El enlace en la respuesta aceptada también me ayudó mucho. Después de ver que la sintaxis y la lógica eran coherentes y funcionaban, tuve que determinar qué estaba mal con respecto a mi configuración. Me avergüenza decir que era yo quien pasaba en jQuery, pero en mi arnés de prueba, donde estaba tratando de que esto funcionara, en realidad no estaba usando jQuery. Esto significaba que el módulo no se estaba cargando realmente, por lo que myns nunca se configuró.

Gracias a todos. Esperemos que esto pueda ser útil para alguien en el futuro. Si usa lo anterior, asegúrese de incluir el objeto jQuery. La otra opción es no pasar en jQuery y eliminar $ de la lista de parámetros.

Respuestas a la pregunta(2)

Su respuesta a la pregunta