Estou mantendo algum código legado e percebi que o seguinte padrão para definir objetos é usado:
var MyObject = {};
(function (root) {
root.myFunction = function (foo) {
//do something
};
})(MyObject);
Existe algum propósito para isso? É equivalente a apenas fazer o seguinte?
var MyObject = {
myFunction : function (foo) {
//do something
};
};
Não estou prestes a embarcar em uma busca sagrada para refatorar toda a base de código de acordo com meus gostos, mas eu realmente gostaria de entender a razão por trás dessa maneira indireta de definir objetos.
Obrigado!
javascript
javascript-objects
Sebastián Vansteenkiste
fonte
fonte
myFunction
poderia usar algumas variáveis definidas fora de si mesmo que não seriam acessíveis de fora. Veja minha respostaRespostas:
É chamado de padrão de módulo http://toddmotto.com/mastering-the-module-pattern/
O principal motivo é para você criar métodos e variáveis verdadeiramente privados. No seu caso, não é significativo porque não esconde nenhum detalhe de implementação.
Aqui está um exemplo em que faz sentido usar o padrão de módulo.
Considerando que se você apenas usasse um objeto reto
adder
evalue
se tornasse públicoE você poderia quebrá-lo fazendo coisas como
Mas com a versão do módulo
fonte
ns.getNext: function () {
não vai compilar.delete MyNameSpace.getNext
.:)
O objetivo é limitar a acessibilidade de funções dentro do encerramento para ajudar a evitar que outros scripts executem código nele. Ao envolvê-lo em um encerramento, você está redefinindo o escopo de execução de todo o código dentro do encerramento e criando efetivamente um escopo privado. Veja este artigo para mais informações:
http://lupomontero.com/using-javascript-closures-to-create-private-scopes/
Do artigo:
Código:
fonte
myFunction
não está no escopo global na segunda versão. O objetivo é realmente fornecer um escopo onde funções auxiliares internas possam ser definidas.myFunction
está no escopo global porque é definido no objeto globalmyObject
. Na segunda versão, qualquer outro código do aplicativo pode ser executadomyFunction
. Na primeira versão, apenas o código dentro do fechamento tem acesso amyFunction
myFunction
só pode ser executado comoMyObject.myFunction()
, igual à primeira versão.vantagens:
mantém variáveis em escopo privado.
você pode estender a funcionalidade do objeto existente.
o desempenho é aumentado.
Acho que os três pontos simples acima são apenas o suficiente para seguir essas regras. E para mantê-lo simples, nada mais é do que escrever funções internas.
fonte
No caso particular que você mostra, não há diferença significativa, em termos de funcionalidade ou visibilidade.
É provável que o codificador original tenha adotado essa abordagem como uma espécie de modelo, permitindo-lhe definir variáveis privadas que poderiam ser usadas na definição de coisas como
myFunction
:Isso evita calcular
seconds_per_day
cada vez que a função é chamada, ao mesmo tempo que evita que ela polua o escopo global.No entanto, não há nada essencialmente diferente disso e apenas dizer
O codificador original pode ter preferido ser capaz de adicionar funções ao objeto usando a sintaxe declarativa de
root.myFunction = function
, em vez da sintaxe de objeto / propriedade demyFunction: function
. Mas essa diferença é principalmente uma questão de preferência.No entanto, a estrutura obtida pelo codificador original tem a vantagem de que as propriedades / métodos podem ser facilmente adicionados em outro lugar no código:
Resumindo, não há necessidade de adotar essa abordagem se não for necessário, mas também não há necessidade de alterá-la, uma vez que funciona perfeitamente bem e, na verdade, tem algumas vantagens.
fonte
O primeiro padrão pode ser usado como um módulo que pega um objeto e retorna esse objeto com algumas modificações. Em outras palavras, você pode definir esses módulos da seguinte maneira.
E use-o como:
Portanto, uma vantagem pode ser a reutilização deste módulo para usos posteriores.
No primeiro padrão, você pode definir um escopo privado para armazenar suas coisas privadas, como propriedades e métodos privados. Por exemplo, considere este snippet:
Esse padrão pode ser usado para adicionar um método ou propriedade a todos os tipos de objetos, como arrays, literais de objeto, funções.
Na minha opinião, a principal vantagem poderia ser a segunda (criar um escopo privado)
fonte
Este padrão fornece um escopo no qual você pode definir funções auxiliares que não são visíveis no escopo global:
doFoo
é local para a função anônima, não pode ser referenciado de fora.fonte