Frage

Ich habe ein JavaScript-„Objekt“, das folgendermaßen erstellt wurde:

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

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

...

Ich weiß, wie man Namespaces mit Singleton-JavaScript-Objekten emuliert, aber wie kann man ein Objekt wie das oben am besten „benennen“, das intanziert wird?

Ich weiß, dass mehrere JavaScript-Bibliotheken über Namepacing-Funktionen verfügen, aber ich verwende jQuery und möchte dem Mix lieber keine weitere Bibliothek hinzufügen.Ich möchte in der Lage sein, mein eigenes intrinsisches Namespace-Schema für meine JS-Objekte bereitzustellen, die instanziiert werden müssen, möglicherweise unter Ausnutzung von jQuery.

Danke RP

War es hilfreich?

Lösung

Einfach:

if(!MyNamespace) MyNamespace = {};

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

Andere Tipps

Javascript verfügt nicht wirklich über einen Namensraum oder Pakete wie andere Sprachen.Stattdessen gibt es Schließungen.Wenn Sie eine Anwendung haben, die aus mehreren Funktionen, Variablen und Objekten besteht, sollten Sie diese in einem einzigen globalen Objekt unterbringen.Dies hat den gleichen Effekt wie ein Namespace.

Zum Beispiel:

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

Sie könnten auch eine Reihe verschachtelter Objekte erstellen und Pakete simulieren:

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

Sollte nicht viel anders sein:

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

oder du könntest es verwenden

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

um etwas Tipparbeit zu sparen.

Beide Antworten waren sehr hilfreich!Hier ist, was ich am Ende herausgefunden habe:

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

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

Um dann das resultierende „namespaced“-Objekt zu verwenden:

var x = new rpNameSpace.foo()

display( x.getLength() );

Eine andere Alternative könnte die sein bob.js Rahmen:

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'); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top