Espaciado de nombres de Javascript: ¿es este método en particular una buena práctica?

Soy un novato en javascript y se me ocurrió el siguiente esquema para el espacio de nombres:

(function() {
    var ns = Company.namespace("Company.Site.Module");

    ns.MyClass = function() { .... };

    ns.MyClass.prototype.coolFunction = function() { ... };

})();

Company.namespace es una función registrada por un script que simplemente crea la cadena de objetos hasta el Módulo.

Fuera, en ámbito no global:

var my = new Company.Site.Module.MyClass();

Particularmente estoy preguntando sobre el método por el cual oculto la variable ns desde el alcance global - por una función anónima envolvente ejecutada inmediatamente. solo podria escribir Company.Site.Module en todas partes, pero no es SECO y es un poco complicado en comparación con almacenar el ns en una variable local.

¿Lo que usted dice? ¿Qué trampas hay con este enfoque? ¿Hay algún otro método que se considere más estándar?

preguntado el 04 de julio de 12 a las 09:07

@pimvdb Idea ingeniosa, pero se vería un poco raro con varias extensiones para la clase y los métodos... -

2 Respuestas

No necesita abarcar clases de esa manera, solo es necesario si tiene variables globales fuera de la clase. Yo uso este enfoque...

MyApp.MyClass = function() {
};

MyApp.MyClass.prototype = {
   foo: function() {
   }
};

También tenga en cuenta que uso un objeto literal para una declaración de prototipo más limpia

Sin embargo, si necesita abarcar variables globales, puede hacerlo

(function() {
   var scopedGlobalVariable = "some value";

   MyApp.MyClass = function() {
   };
   MyApp.MyClass.prototype = function() {
       foo: function() {
       }
   };
})();

Respondido 10 Jul 12, 15:07

Tu enfoque me parece bien.

Sin embargo, también puede hacer esto de forma ligeramente diferente, devolviendo la "clase" de la función autoejecutable:

Company.Site.Module.MyClass = (function() {
    var MyClass = function() { ... };
    MyClass.prototype.foo = function() { ... };
    return MyClass;
})();

Esto elimina al menos todos los ns. prefijos La función de espacio de nombres todavía se puede utilizar para crear los objetos, pero fuera de la función autoejecutable.

Respondido 04 Jul 12, 09:07

¡Gracias! El problema es que tengo algunas clases y algunas funciones gratuitas en cada espacio de nombres; sin embargo, parece una buena idea combinar las tuyas con las mías, creando las clases con TheClass como una variable local, eliminando los ns dentro de las declaraciones de clase, pero aún teniendo ns afuera. ¿O crees que esto es demasiado? - Max

¡Me parece muy razonable! - Niko

Votando a favor por ahora, pero creo que es una costumbre en SO esperar un día para permitir que otros respondan antes de marcar como aceptado;) - Max

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.