1078 Stimmen

Wie deklariere ich einen Namespace in JavaScript?

Wie erstelle ich einen Namespace in JavaScript, damit meine Objekte und Funktionen nicht von anderen gleichnamigen Objekten und Funktionen überschrieben werden? Ich habe das Folgende verwendet:

if (Foo == null || typeof(Foo) != "object") { var Foo = new Object();}

Gibt es eine elegantere oder prägnantere Methode, dies zu tun?

21 Stimmen

Ich kann sehen, wo Sie mit der Überprüfung gehen, um zu sehen, wenn der Namespace genommen wird, aber da das Objekt nicht erstellt werden, wenn dies fehlschlägt, denke ich, der bessere Ansatz ist zu warnen, wenn der Namespace genommen wird. Offen gesagt sollte dies einfach nicht in den meisten JS-Situationen passieren und sollte schnell in der Entwicklung gefangen werden.

19 Stimmen

Nehmen Sie einen "Namespace" der obersten Ebene (Fenstereigenschaft). Besitzen Sie ihn. Konflikte sollten bereits in der Testphase erkannt werden. Machen Sie sich nicht die Mühe, all diese "Was wäre wenn"-Prüfungen hinzuzufügen. Es ist ein fatales Problem für doppelte "Namensräume" und sollte als solches behandelt werden . Sie können einen Ansatz wie jQuery verfolgen, um das Bewohnen eines benutzerdefinierten "Namespace" zu ermöglichen; aber dies ist immer noch eine Frage der Entwurfszeit.

0 Stimmen

Siehe auch stackoverflow.com/questions/2102591/ bei Leistungsproblemen

2voto

KyleMit Punkte 34627

JavaScript verfügt noch nicht über eine native Darstellung von Namespaces, TypeScript hingegen schon.

Sie könnten zum Beispiel den folgenden TS-Code verwenden ( Spielplatz )

namespace Stack {
    export const hello = () => console.log('hi')
}

Stack.hello()

Wenn Sie Ihren Code nicht auf TS aktualisieren können, können Sie zumindest das Muster verwenden, das TS bei der Generierung der JS-Ausgabe für Namespaces verwendet und das wie folgt aussieht:

var Stack;
(function (Stack) {
    Stack.hello = () => console.log('hi');
})(Stack || (Stack = {}));
Stack.hello();

Weitere Lektüre:

2voto

haxpanel Punkte 3928

Mir gefällt die Lösung von Jaco Pretorius, aber ich wollte das Schlüsselwort "this" etwas nützlicher machen, indem ich es auf das Modul/Namensraum-Objekt verweise. Meine Version von skillet:

(function ($, undefined) {

    console.log(this);

}).call(window.myNamespace = window.myNamespace || {}, jQuery);

1voto

ganesh Punkte 307

Wir können sie auf diese Weise unabhängig nutzen:

var A = A|| {};
A.B = {};

A.B = {
    itemOne: null,
    itemTwo: null,
};

A.B.itemOne = function () {
    //..
}

A.B.itemTwo = function () {
    //..
}

1voto

Saurabh tiwary Punkte 21

In JavaScript gibt es keine vordefinierten Methoden zur Verwendung von Namespaces. In JavaScript müssen wir unsere eigenen Methoden erstellen, um NameSpaces zu definieren. Hier ist ein Verfahren, das wir in Oodles-Technologien befolgen.

Einen NameSpace registrieren Nachfolgend die Funktion zur Registrierung eines Namensraums

//Register NameSpaces Function
function registerNS(args){
 var nameSpaceParts = args.split(".");
 var root = window;

 for(var i=0; i < nameSpaceParts.length; i++)
 {
  if(typeof root[nameSpaceParts[i]] == "undefined")
   root[nameSpaceParts[i]] = new Object();

  root = root[nameSpaceParts[i]];
 }
}

Um einen Namespace zu registrieren, rufen Sie einfach die obige Funktion mit dem Argument als Namensraum getrennt durch '.' (Punkt). Zum Beispiel Der Name Ihrer Anwendung sei oodles. Sie können einen Namespace mit der folgenden Methode erstellen

registerNS("oodles.HomeUtilities");
registerNS("oodles.GlobalUtilities");
var $OHU = oodles.HomeUtilities;
var $OGU = oodles.GlobalUtilities;

Grundsätzlich wird Ihre NameSpaces-Struktur wie unten im Backend erstellt:

var oodles = {
    "HomeUtilities": {},
    "GlobalUtilities": {}
};

In der obigen Funktion haben Sie einen Namespace namens "oodles.HomeUtilities" y "oodles.GlobalUtilities" . Um diese Namensräume aufzurufen, erstellen wir eine Variable, z.B. var $OHU und var $OGU .

Diese Variablen sind nichts anderes als ein Alias zur Intialisierung des Namespace. Wann immer Sie nun eine Funktion deklarieren, die zu HomeUtilities werden Sie es wie folgt deklarieren:

$OHU.initialization = function(){
    //Your Code Here
};

Der obige Funktionsname wird initialisiert und in einen Namespace eingefügt $OHU . und diese Funktion überall in den Skriptdateien aufzurufen. Verwenden Sie einfach den folgenden Code.

$OHU.initialization();

Ähnlich verhält es sich mit dem anderen NameSpaces.

Ich hoffe, es hilft.

1voto

Samuel Danielson Punkte 4738

Wenn Sie ein Makefile verwenden, können Sie dies tun.

// prelude.hjs
billy = new (
    function moduleWrapper () {
    const exports = this;

// postlude.hjs
return exports;
})();

// someinternalfile.js
function bob () { console.log('hi'); }
exports.bob = bob;

// clientfile.js
billy.bob();

Ich ziehe es vor, ein Makefile zu verwenden, sobald ich etwa 1000 Zeilen erreicht habe, weil ich große Teile des Codes auskommentieren kann, indem ich eine einzige Zeile im Makefile entferne. Das macht es einfach, an Dingen herumzupfuschen. Außerdem taucht der Namensraum bei dieser Technik nur einmal im Vorspann auf, so dass er leicht zu ändern ist und man ihn nicht ständig im Bibliothekscode wiederholen muss.

Ein Shell-Skript für die Live-Entwicklung im Browser bei Verwendung eines Makefiles:

while (true); do make; sleep 1; done

Fügen Sie dies als Make-Task "go" hinzu und Sie können "make go" verwenden, um Ihr Build während des Programmierens zu aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X