Pregunta

Tengo un "objeto" de JavaScript, construido de esta manera:

function foo()
{
    this.length = 0;
}

foo.prototype.getLength = function()
{
    return this.length;
}

...

Sé cómo emular espacios de nombres con objetos JavaScript singleton, pero ¿cuál es la mejor manera de "poner nombres" a un objeto como el anterior que se instanciará?

Sé que varias bibliotecas de JavaScript tienen capacidades de espacios de nombres, pero estoy usando jQuery y preferiría no agregar otra biblioteca a la mezcla.Me gustaría poder proporcionar el mío propio, tal vez explotando jQuery, un esquema de espacio de nombres intrínseco para mis objetos JS que necesitan ser instanciados.

Gracias RP

¿Fue útil?

Solución

Simple:

if(!MyNamespace) MyNamespace = {};

MyNamespace.foo = function() {
   this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
   return this.length;
};

Otros consejos

Javascript realmente no tiene espacios de nombres ni paquetes como otros lenguajes.En cambio tiene cierres.Si tiene una aplicación que consta de múltiples funciones, variables y objetos, entonces debe colocarlos dentro de un único objeto global.Esto tendrá el mismo efecto que un espacio de nombres.

Por ejemplo:

var namespace = {
  this.foo: function(){
    ...
  },
  this.foo.prototype.getLength: function(){
    ...
  }
}

También puedes crear un conjunto de objetos anidados y simular paquetes:

loadPackage = function(){
  var path = arguments[0];
  for(var i=1; i<arguments.length; i++){
    if(!path[arguments[i]]){
      path[arguments[i]] = {};
    }
    path = path[arguments[i]];
  }
  return path;
}

loadPackage(this, "com", "google", "mail") = {
  username: "gundersen",
  login: function(password){
    ...
  }
}
this.com.google.mail.login("mySecretPassword");

No debería ser muy diferente:

namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }

o podrías usar

(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();

para ahorrar algo de escritura.

¡Ambas respuestas fueron muy útiles!Esto es con lo que terminé:

if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};

rpNameSpace.foo = function() {
    this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
    return this.length * 2;
}

Luego, para usar el objeto "espaciado de nombres" resultante:

var x = new rpNameSpace.foo()

display( x.getLength() );

Otra alternativa puede ser la bob.js estructura:

bob.ns.setNs('myApp.myFunctions', { 
    say: function(msg) {  
        console.log(msg); 
    } 
}); 

//sub-namespace
bob.ns.setNs('myApp.myFunctions.mySubFunctions', { 
    hello: function(name) { 
        myApp.myFunctions.say('Hello, ' + name); 
    } 
}); 

//call:
myApp.myFunctions.mySubFunctions.hello('Bob'); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top