2009-10-09 3 views
5

Actualmente estoy usando el siguiente patrón para crear espacios de nombres y objetos únicos en Javascript:Javascript: namespacing

var Namespace = function() { 

    var priv = { 
     privateVar1: '', 
     privateVar2: '', 
     privateFunction1: function() { 
      //do stuff 
      [...] 
     }, 
     [...] 
    }; 

    var pub = { 
     publicVar1: '', 
     publicFunction1: function() { 
       //do stuff with private functions and variables 
       priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
      [...] 
     }, 
     [...] 
    }; 

    return pub; 
}(); 

espero se entiende la idea. ¿Hay alguna manera de crear espacios de nombres que creas que son más limpios o mejores (explica por qué)?

+0

duplicado: http: // stackoverflow.com/questions/6549629/preferred-technique-for-javascript-namespacing (la pregunta más reciente es más clara) –

Respuesta

5

En realidad, todo se trata de semántica. Si está separando varios códigos de código y planea utilizar un espacio de nombres general, entonces hacer algo como esto es un poco más fácil:

La razón por la que disfruto este método es que es mucho más modular y permite codificar dividirse en varios archivos y luego simplemente comprimirlos en uno sin problemas de dependencia (a menos que las funciones de espacio de nombres dependan entre sí)

La desventaja de esto es que puede sentirse un poco desordenado si se usa incorrectamente - - Lo cual supongo que se puede aplicar a cualquier cosa.

En el archivo de espacio de nombres

var Namespace = {}; 

En sus otros archivos JavaScript que están utilizando el espacio de nombres

var Namespace = Namespace === undefined ? {} : Namespace; 

Namespace.stuff = function() { 
    var private = 'foo'; 
    function private_func() { 
    }; 

    this.public = 'bar'; 
    this.public_func = function() { 
    } 
}; 

alguna aplicación práctica sería:

GUI.js

// Some general GUI 
var GUI = { 
    'MAX_WIDTH': $(window).width(), 
    'MAX_HEIGHT': $(window).height() 
}; 

Toolbar.js

GUI.Toolbar = function (id) { 
    var self = this; 

    function init_visuals() { 
     $(id).click(function() { 
      self.alert_broken(); 
     }); 
    }; 

    function initialize() { 
     init_visuals(); 
    }; 

    this.alert_broken = function() { 
     alert('Broken!'); 
    }; 

    initialize(); 
}; 

Menu.js

GUI.Menu = function() { 
}; GUI.Menu.prototype = new GUI.Toolbar(); 

Ahora, únicos - Ese es otro argumento.

+0

Creo que su ejemplo está quebrado. "privado" y "público" no se pueden usar como nombre de variable porque están reservados: http://javascript.about.com/library/blreserved.htm. En segundo lugar, ni "público" ni "público_func" es alcanzable. –

+0

Probablemente no pensó en eso :) Si estás equivocado, public y public_func están disponibles a través de Namespace.stuff.public y Namespace.stuff.public_funct. Gracias Justin, me gusta mejor tu método. Gracias también Tim, tu ejemplo se puede combinar con otros patrones y será útil. –

0

Esto es bueno, pero es mejor declarar las variables privadas como variables locales en el espacio de nombres, en lugar de usar un objeto priv. Ventajas: menos código, el empacador puede reducir los nombres de las variables. Intente empaquetar su código aquí: http://dean.edwards.name/packer/

0

Creo que su ejemplo está bien y toda esta pregunta es principalmente sobre el gusto. Sin embargo, yo wourld escribo de esta manera:

var NAMESPACE = { 

    publicVar1: '', 
    publicFunction1: (function(){ 

     var privateVar1 = ''; 
     var privateVar2 = ''; 
     function privateFunction1() { 
      //do stuff 
      //[...] 
     }; 

     return function(){ 
      //do stuff with private functions and variables 
      priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
     } 
    })() 
} 

En primer lugar, el espacio de nombres debe ser todo MAYÚSCULAS COMPLETAS, como Douglas Crockford sugiere y como se ve por YAHOO.

En segundo lugar, creo NAMESPACE con sus propiedades directamente, no a través de una función anónima. Pero creé la función publicFunction1 dentro de una función anónima, por lo que puedo definir funciones privadas y variables dentro de ella. Eso es ligeramente diferente, porque el alcance es incluso más pequeño que en su ejemplo. La ventaja es que otras funciones dentro del mismo espacio de nombres pueden usar los mismos nombres de variable. La desventaja es, bueno, otra función no comparte las mismas variables con esa función :-)