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

8voto

mckoss Punkte 6444

Nachdem ich mehrere meiner Bibliotheken in verschiedene Projekte portiert habe und ständig den (statisch benannten) Namespace der obersten Ebene ändern musste, bin ich dazu übergegangen, diese kleine (quelloffene) Hilfsfunktion zur Definition von Namespaces zu verwenden.

global_namespace.Define('startpad.base', function(ns) {
    var Other = ns.Import('startpad.other');
    ....
});

Eine Beschreibung der Vorteile finden Sie auf meiner Blog-Beitrag . Sie können sich die Quellcode hier .

Einer der Vorteile, die ich sehr schätze, ist die Isolierung zwischen den Modulen in Bezug auf die Lastreihenfolge. Sie können auf ein externes Modul verweisen, BEVOR es geladen wird. Und der Objektverweis, den Sie erhalten, wird eingefügt, wenn der Code verfügbar ist.

8voto

Razan Paul Punkte 12902

Ich verwende die folgende Syntax für den Namensraum.

var MYNamespace = MYNamespace|| {};

 MYNamespace.MyFirstClass = function (val) {
        this.value = val;
        this.getValue = function(){
                          return this.value;
                       };
    }

var myFirstInstance = new MYNamespace.MyFirstClass(46);
alert(myFirstInstance.getValue());

jsfiddle: http://jsfiddle.net/rpaul/4dngxwb3/1/

6voto

Yairopro Punkte 6777

Ich denke, Sie verwenden alle zu viel Code für ein so einfaches Problem. Es ist nicht nötig, ein Repo dafür zu erstellen. Hier ist eine einzeilige Funktion.

namespace => namespace.split(".").reduce((last, next) => (last[next] = (last[next] || {})), window);

Probieren Sie es aus:

// --- definition ---
const namespace = name => name.split(".").reduce((last, next) => (last[next] = (last[next] || {})), window);

// --- Use ----
const c = namespace("a.b.c");
c.MyClass = class MyClass {};

// --- see ----
console.log("a : ", a);

5voto

Pavel Chuchuva Punkte 21957

ES6-Module Namespace-Importe

// circle.js
export { name, draw, reportArea, reportPerimeter };

// main.js
import * as Circle from './modules/circle.js';

// draw a circle
let circle1 = Circle.draw(myCanvas.ctx, 75, 200, 100, 'green');
Circle.reportArea(circle1.radius, reportList);
Circle.reportPerimeter(circle1.radius, reportList);

Damit werden alle Exporte, die in circle.js verfügbar sind, als Mitglieder eines Objekts verfügbar gemacht Circle und erhält damit seinen eigenen Namensraum.

3voto

nomæd Punkte 381

Mein Lieblingsmuster ist in letzter Zeit dieses geworden:

var namespace = (function() {

  // expose to public
  return {
    a: internalA,
    c: internalC
  }

  // all private

  /**
   * Full JSDoc
   */
  function internalA() {
    // ...
  }

  /**
   * Full JSDoc
   */
  function internalB() {
    // ...
  }

  /**
   * Full JSDoc
   */
  function internalC() {
    // ...
  }

  /**
   * Full JSDoc
   */
  function internalD() {
    // ...
  }

})();

Natürlich kann return am Ende stehen, aber wenn nur Funktionsdeklarationen folgen, ist es viel einfacher zu sehen, worum es in dem Namespace geht und welche API verfügbar ist.

Die Verwendung von Funktionsausdrücken in solchen Fällen führt dazu, dass man nicht wissen kann, welche Methoden offengelegt werden, ohne den gesamten Code zu überprüfen.

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