2010-03-10 7 views
5

Was ist der beste Weg, um statische Variablen für jQuery-Plugins zu erstellen?Statische Variablen a jQuery Plugins; Wie erstellt man?

Ich habe 2 Beispiel-Anwendungsfälle, um mein Denken so weit zu veranschaulichen; jeder mit ein paar Ideen.
Andere Ideen natürlich willkommen ...

Ein Beispiel ist für eine statische Variable, die enthält: Animationseinstellungen, Layouteinstellungen, Produktdetails usw .; der andere für eine statische Variable Caching-Daten.

Ich hoffe 'statisch' ist die richtige Terminologie hier ... single globals. Bitte korrigieren Sie wenn falsch.

Fall 1: für Einstellungen

// defining globally 
var anObject = { 
value1 = 0; 
value2 = 0; 
} 

jQuery.anObjectSet(partialObject) { 
anObject = jQuery.extend(anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
obj = jQuery.extend(anObject, partialObject); 
} 

oder vielleicht?

// adding to the jQuery object 
jQuery.anObject = { 
value1 = 0; 
value2 = 0; 
} 

jQuery.anObjectSet(partialObject) { 
jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
obj = jQuery.extend(jQuery.anObject, partialObject); 
} 

oder vielleicht?

jQuery.anObjectSet(partialObject) { 
if(!jQuery.anObject) 
    jQuery.anObject = { 
    value1 = 0; 
    value2 = 0; 
    } 

jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
if(!jQuery.anObject) 
    jQuery.anObject = { 
    value1 = 0; 
    value2 = 0; 
    } 
obj = jQuery.extend(jQuery.anObject, partialObject); 
} 

Fall 2: für das Caching

jQuery.fn.myPlugin = function (newObject) { 
if(!cache[newObject]) 
    cache[newObject] = $(newObject); 

return cache[newObject]; 
} 

oder vielleicht? (Ich habe diese Methode woanders gesehen)

window.$cache = {}; 

jQuery.fn.myPlugin = function (newObject) { 
if(!$cache[newObject]) 
    $cache[newObject] = $(newObject); 

return $cache[newObject]; 
} 

Danke. Ich möchte eine .js-Bibliothek aufbauen, die auf dem richtigen Weg beginnt ...

Antwort

11

Wenn Sie eine "globale" oder statische Variable für Ihre Bibliothek und Ihre Bibliothek allein erstellen möchten, ist eine Schließung der richtige Weg gehen.

Ein normales globales ist eine schlechte Sache, weil es den Namensraum verschmutzt, und Sie haben keine Ahnung, wer Ihre Bibliothek laufen wird.

Indem wir die statische Variable innerhalb einer anonymen Funktion definieren, geben wir uns Zugriff auf eine Variable, die niemand anfassen kann und die im Sinne unserer Funktionen effektiv "global" ist. Wenn ich richtig verstehe, was du zu tun versuchst, sollte es dies erreichen.

(function($){ 
    var $cache = {}; 

    jQuery.fn.myPlugin = function (newObject) { 
     if(!$cache[newObject]) 
     $cache[newObject] = $(newObject); 

     return $cache[newObject]; 
    } 

})(jQuery); 

Edit:

Die $cache Variable ist nur innerhalb dieser anonymen Funktion definiert zugänglich Funktionen sein. Wenn also die anderen Funktionen auf diese Datei zugreifen müssen, müssen sie auch in dieser anonymen Funktion definiert sein.

Die einzige Alternative hier alles (AFAIK) zu definieren, ist eine Kombination von Zugriffsfunktionen zu haben, eine einfache Funktion innerhalb dieser Schließung, deren Zweck definiert ist außerhalb Funktionen Zugriff auf die $cache bereitzustellen.

Vorzugsweise würde ich mit der Definition der notwendigen Funktionen innerhalb dieses Verschlusses gehen. Dies ist jedoch letztendlich ein Implementierungsdetail und liegt in Ihrem Ermessen.

+1

ps, ​​gibt es einen "Plugin Development" Abschnitt @ http: //docs.jquery.com/Tutorials, wenn du mehr lesen willst :-) – Seaux

+0

das ist großartig ~ eine frage: ich erstelle ein anderes plugin mit dieser technik woanders. es ist in einer anonymen Funktion verpackt, wie oben empfohlen. Wird es Zugriff auf $ cache haben? Oder müsste die Funktion des Plugins in derselben anonymen Funktion enthalten sein? weg zu testen ... – Ross

+0

@Danny danke für den Schnitt. brillant. +1 erneut, wenn nur möglich. – Ross

Verwandte Themen