Como abranger o namespace javascript em vários arquivos?

Eu ignorei o javascript para sempre. Comecei a usar o jQuery há alguns anos para poder sobreviver. Mas como eu comecei a fazer TDD mais eu decidi ontem para realmente mergulhar em javascript (e possivelmente coffeescript depois disso).

No meu aplicativo ASP.NET Web Forms eu tenho muitas páginas e atualmente a maioria dessas páginas não tem uma tonelada de javascript. Eu estou no processo de mudar isso. Estou usando Jasmine com Chutzpah para criar meus testes.

Eu estava me movendo junto com meus testes passando e falhando como esperado. Mas então eu queria criar um namespace para que eu não estivesse atropelando todo o espaço global.

Depois de ler este artigo:http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/

Decidi tentar usar o padrão da seção Função auto-executável anônima: parte 2 (público e privado) do artigo. Parece ter a maior flexibilidade e parece encapsular as coisas muito bem.

Eu tenho uma pasta chamada / Scripts. Sob essa pasta estão alguns dos frameworks que estou usando como jQuery, jasmine, bootstrap e modernizr. Eu também tenho uma subpasta chamada / Site onde estou colocando meu código para o site em vários arquivos baseados na página. (product.js, billing.js, etc.)

Em / Scripts / Site, adicionei uma subpasta a / Tests (ou Specs) que possui os arquivos (product_test.js, billing_tests.js, etc.).

Sem ter namespaces, tudo está bem. Eu tenho um arquivo utility.js que eu criei com umpadLeft função auxiliar. Em seguida, usei o padLeft global em outro arquivo .js. Todos os meus testes funcionaram e eu fiquei feliz. Então decidi descobrir o namespace e mudei meu Scripts / Site / utility.js para parecer com:

<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>

Então no meu Scripts / Site / Tests / utility_test.js eu tenho

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

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

Com esse teste extremamente simples, esperava-se que algo voltasse com o valor de string de "alguma coisa".

Não faz. VoltaIndefinido.

Então, como usar o namespace javascript em vários arquivos?

Desculpe pela longa introdução, mas achei que isso poderia ajudar a explicarporque de mim fazendo assim. Eu também coloco tudo isso porque estou aberto a ouvir idéias sobre como essa configuração está totalmente errada ou parcialmente errada ou o que quer que seja.

Obrigado por tomar o tempo para ler esta pergunta.

ATUALIZAÇÃO: RESOLVIDO Obrigado a todos pela vossa ajuda. A maior ajuda veio do comentarista @ T.J. Multidão. Eu não sabia que a ferramenta jsbin existia e depois de ter sido convencido de que o código que eu coloquei acima foi colocado na ferramenta e os resultados estavam certos, eu sabia que algo tinha que estar desligado no meu ambiente.

O link na resposta aceita também me ajudou muito. Depois de ver que a sintaxe e a lógica estavam consistentes e funcionando, eu só tinha que determinar o que estava errado na minha configuração. Tenho vergonha de dizer que fui eu que passei no jQuery, mas no meu arnês de testes, onde eu estava tentando fazer com que isso funcionasse, eu não estava realmente usando o jQuery. Isso significa que o módulo não estava sendo carregado - então o myns nunca foi definido.

Obrigado a todos. Espero que isso possa ser útil para alguém no futuro. Se você usar o acima, certifique-se de incluir o objeto jQuery. A outra opção é não passar no jQuery e remover o $ da lista de parâmetros.

questionAnswers(2)

yourAnswerToTheQuestion