2012-04-11 8 views
1

Ich habe eine sehr große Javascript-Datei: es ist über 9.000 Zeilen. Der Code sieht wie folgt aus:Namespacing große Javascript wie jQuery

var GlobalVar1 = ""; 
var GlobalVar2 = null; 

function A() {...} 

function B(SomeParameter) {...} 

Ich bin mit dem Google-Compiler und die globalen Variablen und Funktionen a, b erhalten umbenannt, c ... und es gibt eine gute Änderung, dass es möglicherweise einige Kollision später mit einigen außerhalb des Codes.

Ich möchte meinen Code wie die jquery-Bibliothek organisiert haben, wo alles mit $ zugänglich ist. Gibt es eine Möglichkeit, meinen Code mit einem Namespace zu versehen, so dass zum Beispiel alles hinter einem # -Zeichen steht.

Ich möchte das meinen Code aufzurufen haben:

#.GlobalVar 
#.functionA(SomeParameter) 

Wie kann ich das tun?

+2

'#' ist kein gültiges Zeichen acter in JavaScript-Bezeichnern. Unter "Namespacing" sehen Sie sich das Modulmuster an. Globale Variablen werden in lokale Variablen umgewandelt und über Schließungen aufgerufen. Andere Variablen und Funktionen, die außerhalb des "Namespace" verfügbar sein sollen, werden als Eigenschaften eines einzelnen globalen Objekts gehalten. – RobG

+0

Sie können jedoch $ und _ verwenden, die beide gültige Zeichen –

+0

Duplikat von http://stackoverflow.com/questions/6549629/preferred-technique-for-javascript-namespacing sind (die verknüpfte Frage ist allgemeiner anwendbar) –

Antwort

2
var $$ = { 
    A: function() { 
     alert('namespace rules!'); 
    }, 
    B: function() { 
     alert('foo'); 
    } 
} 
$$.A(); 
$$.B(); 
​ 

LIVE DEMO

Und so weiter ...

Bitte beachte, dass ich für ein Variable #-$$ weil # in illegaler Toke geändert Name.

+0

Nicht das ' $ 'ist eine gute Wahl, da es mit anderen gängigen Bibliotheken kollidiert. – Thilo

+0

@Thilo. Es ist ein Beispiel ... Aber ich bearbeitet, nur für dich ... :-) – gdoron

+0

ok, und dann in meinem Code, anstatt FunktionA (SomeParameter) zu schreiben, rufe ich die Funktion auf, indem ich $ .A schreibe und wenn ich will Um auf meine aktuelle globale Variable zuzugreifen, schreibe ich $ .MyGlobal = 3; anstelle von MyGlobal = 3; ? Wenn # nicht gut ist und $ bereits vergeben ist, was ist eine gute Alternative? Ist @ oder% oder & besser? – frenchie

1
var # = { 
    GlobalVar1: "", 
    GlobalVar2: null, 

    A: function() { 

    }, 

    B: function(SomeParameter) { 

    } 
} 
3

Side Anmerkung: die # Zeichen kein gültiger Variablenname (siehe this question). Häufige "Shorthands" sind der Unterstrich _ und Dollar $. Ich erinnere mich zu lesen, dass die Verwendung des Dollars für maschinengenerierten Code gedacht war, aber dies wurde weitgehend ignoriert, wie Sie in jQuery sehen können.

Die bekannteste Technik geht so:

(function($) { 
    $.a = function() { ... } 
    $.b = 1000; 
})(myNamespace); 

myNamespace.a(...); 

Entweder die Art und Weise, ich glaube, Sie werden Aufgaben in Ihrem Code haben müssen einige variabel.

Alternativ könnten Sie so etwas wie eine Klasse angeben:

function MyClass() { 
    var f = 0; 

    function a() { return f; } 
    function b(value) { f = value; } 
    function c() { f *= f; } 

    this.get = a; 
    this.set = b; 
    this.square = c; 
} 

var myInstance = new MyClass(); 
+0

Das $ Zeichen wurde für maschinengenerierten Code in ECMA-262 ed 3 gedacht. Ich denke, Prototype.js war der erste, der seine Verwendung in Bezeichnern popularisierte (möglicherweise um Variablennamen in anderen Sprachen als das Original nachzuahmen Autor war vertrauter). jQuery hat es von dort ausgeliehen. – RobG

3

Sie haben alle Ihre Bibliothek in einem Verschluss wickeln Sie Ihre lokale Variablen zu schützen. Die Mitglieder, auf die Sie global zugreifen möchten, sollten Sie einem globalen Kontextobjekt zuweisen (im Browser ist dies window).

(function(){ 
    var GlobalVar1 = ""; 
    var GlobalVar2 = null; 

    function A() {...} 

    function B(SomeParameter) {...} 

    // some function accessible globally with `window.C()` or just `C()`: 
    window.C = function() {} 
})(); 
+0

Sie können auch die Funktion Test() {} var foo = new Test(); –

1

Eine andere Möglichkeit - wenn Sie Closure Compiler bereits verwenden - wäre, seine Funktionen zu verwenden, um Namespacing zu behandeln.

Beispiel:

mylib.js:

goog.provide('mynamespace.whatever'); 

var globalVar1='foo'; 

mynamespace.whatever.functionA=function(txt){ 
    alert('A: '+txt+' '+globalVar1); 
}; 

mynamespace.whatever.functionB=function(){ 
    alert('B: '+txt+' '+globalVar1); 
}; 

main.js:

goog.require('mynamespace.whatever'); 

mynamespace.whatever.functionA('hello world'); 


Und wenn Sie unverschleierte Funktionen/Variablen außerhalb des kompilierten Codes verwenden möchten, können Sie verwenden:

goog.exportProperty(object, publicName, symbol) 

und

goog.exportSymbol(publicPath, object, opt_objectToExportTo) 

Werfen Sie einen Blick auf : http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html