Domanda

Ho un "oggetto" JavaScript, costruito in questo modo:

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

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

...

So come emulare gli spazi dei nomi con oggetti JavaScript singleton, ma qual è il modo migliore per "namepace" un oggetto come quello sopra che verrà instanziato?

So che diverse librerie JavaScript hanno funzionalità di namepacing, ma sto usando jQuery e preferirei non aggiungere un'altra libreria al mix.Mi piacerebbe essere in grado di fornire il mio, magari sfruttando jQuery, schema di namespace intrinseco per i miei oggetti JS che necessitano di essere istanziati.

Grazie RP

È stato utile?

Soluzione

Semplice:

if(!MyNamespace) MyNamespace = {};

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

Altri suggerimenti

Javascript non ha realmente spazio dei nomi o pacchetti come altri linguaggi.Invece ha delle chiusure.Se hai un'applicazione composta da più funzioni, variabili e oggetti, dovresti inserirli all'interno di un singolo oggetto globale.Ciò avrà lo stesso effetto di uno spazio dei nomi.

Per esempio:

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

Potresti anche creare una serie di oggetti nidificati e simulare i pacchetti:

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");

Non dovrebbe essere molto diverso:

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

oppure potresti usare

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

per risparmiare un po' di digitazione.

Entrambe le risposte sono state molto utili!Ecco cosa ho ottenuto:

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

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

Quindi, per utilizzare l'oggetto "namespace" risultante:

var x = new rpNameSpace.foo()

display( x.getLength() );

Un'altra alternativa potrebbe essere la bob.js struttura:

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'); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top