2008-08-22 29 views
9

Tengo un "objeto" JavaScript, construidos de esta manera:¿Cómo proporcionar espacios de nombres en JavaScript con objetos instanciados

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

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

... 

Sé cómo emular espacios de nombres con objetos singleton de JavaScript, pero lo que es la mejor manera de para "nombrar" un objeto como el anterior que se integrará?

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

Gracias rp

Respuesta

11

simple:

if(!MyNamespace) MyNamespace = {}; 

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

Misses creación de prototipos desde instanciaof shoudl no funciona. – Chameleon

+0

@Chameleon - ¿eh? ¡¿De qué estás hablando?! "prototipo" es una propiedad automáticamente, no tiene que ser "creado" per se –

2

no debe ser muy diferente:

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

o se puede utilizar

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

para ahorrar algo de mecanografía.

6

Javascript en realidad no tiene espacio de nombres o los paquetes al igual que otros idiomas. En cambio, tiene cierres. Si tiene una aplicación que consta de múltiples funciones, variables y objetos, debe colocarlos dentro de un solo 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 podría 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"); 
+0

Buenos consejos, pero creo que quieres dos puntos en vez de punto y coma en tu primer ejemplo, ¿no? – harpo

2

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

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

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

A continuación, utilizar el "espacio de nombres" objeto resultante:

var x = new rpNameSpace.foo() 

display(x.getLength()); 
-1

Otra alternativa puede ser el marco bob.js:

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'); 
Cuestiones relacionadas