Question

J'ai un JavaScript "objet", construit de cette façon:

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

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

...

Je sais comment émuler les espaces de noms avec singleton objets en JavaScript, mais quelle est la meilleure façon de "namepace" un objet tel que celui ci-dessus qui intanced?

Je sais que plusieurs bibliothèques JavaScript ont namepacing capacités, mais je suis en utilisant jQuery et préfère ne pas ajouter une autre bibliothèque pour le mix.Je voudrais être en mesure de fournir mon propre, peut-être par l'exploitation de jQuery, intrinsèque namespacing régime de la JS objets de la mine qui doivent être instanciées.

Merci rp

Était-ce utile?

La solution

Simple:

if(!MyNamespace) MyNamespace = {};

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

Autres conseils

Javascript n'a pas vraiment d'espace de noms ou de colis à l'instar d'autres langues.Au lieu de cela il a des fermetures.Si vous avez une application qui se compose de plusieurs fonctions, des variables et des objets, vous devez les mettre à l'intérieur d'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 également 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");

Ne devrait pas être plus différents:

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

ou vous pourriez utiliser

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

pour économiser un peu de temps.

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

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

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

Ensuite, pour utiliser un "espace de noms" objet:

var x = new rpNameSpace.foo()

display( x.getLength() );

Une autre alternative pourrait être la bob.js cadre:

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'); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top