2008-08-22 6 views
9

J'ai un « objet » JavaScript, construit ainsi:Comment fournir des espaces de noms en JavaScript avec des objets instanciés

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

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

... 

Je sais comment imiter avec des objets namespaces singleton JavaScript, mais quelle est la meilleure façon "nommer" un objet tel que celui ci-dessus qui sera activé?

Je sais que plusieurs bibliothèques JavaScript ont des capacités d'espacement, mais j'utilise jQuery et je préfère ne pas ajouter une autre bibliothèque au mixage. Je voudrais être en mesure de fournir le mien, peut-être en exploitant jQuery, le schéma d'espacement intrinsèque pour les objets JS qui doivent être instanciés.

Merci rp

Répondre

11

simple:

if(!MyNamespace) MyNamespace = {}; 

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

création prototype Misses depuis L'instance de shoudl ne fonctionne pas. – Chameleon

+0

@Chameleon - hein? Qu'est-ce que tu racontes?! "prototype" est une propriété automatiquement, il ne doit pas être "créé" en soi –

2

ne devrait pas être très différent:

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

ou vous pouvez utiliser

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

pour économiser quelques.

6

Javascript ne pas vraiment espace de noms ou paquets comme d'autres langues. Au lieu de cela, il a des fermetures. Si vous avez une application composée de plusieurs fonctions, variables et objets, vous devez les placer dans un seul objet global. Cela aura le même effet qu'un espace de noms.

Par exemple:

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

Vous pouvez aussi créer un ensemble d'objets imbriqués et simuler des paquets:

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

Bons conseils - mais je pense que vous voulez des deux-points au lieu de points-virgules dans votre premier exemple, non? – harpo

2

Les deux réponses ont été très utiles! Voici ce que j'ai fini avec:

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

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

Puis, d'utiliser le résultat objet "espaces de noms":

var x = new rpNameSpace.foo() 

display(x.getLength()); 
-1

Une autre alternative peut être le cadre 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'); 
Questions connexes