2010-12-28 8 views
7

Was sind einige aktuelle "Faustregeln" für die Implementierung JQuery Namespaces für allgemeine Dienstprogrammfunktionen hosten?Best Practices für JQuery-Namespaces + allgemeine Dienstprogrammfunktionen

Ich habe eine Reihe von JavaScript-Utility-Methoden verstreut in verschiedenen Dateien, die ich in einem (oder mehreren) Namespaces konsolidieren möchte. Was ist der beste Weg, dies zu tun?

ich zur Zeit an zwei verschiedenen Syntaxen suchen, aufgeführt in der Reihenfolge ihrer Präferenz:

//****************************** 
    // JQuery Namespace syntax #1 
    //****************************** 
    if (typeof(MyNamespace) === "undefined") 
    { 
    MyNamespace = {}; 
    } 

    MyNamespace.SayHello = function() 
    { 
    alert("Hello from MyNamespace!"); 
    } 

    MyNamespace.AddEmUp = function (a, b) 
    { 
    return a + b; 
    } 

    //****************************** 
    // JQuery Namespace syntax #2 
    //****************************** 
    if (typeof (MyNamespace2) === "undefined") 
    { 
    MyNamespace2 = 
    { 
     SayHello: function() 
     { 
      alert("Hello from MyNamespace2!"); 
     }, 

     AddEmUp: function (a, b) 
     { 
      return a + b; 
     } 
    }; 
    } 

Syntax # 1 ausführliche, aber es scheint, als wäre es einfacher, die Straße zu halten hinunter. Ich muss keine Kommas zwischen Methoden hinzufügen, und ich kann alle meine Funktionen ausrichten.

Gibt es andere, besser Möglichkeiten, dies zu tun?

+0

Ich denke, besser ist die Syntax # 1 ist, da es Sie den Namensraum in mehrere Dateien verwenden. Ich verwende diese Methode in meinen Projekten. –

+0

Ich sollte diese Frage auch auf Namespaces erweitern, die Aufzählungen enthalten. Für Enums würde ich immer noch Syntax # 1 bevorzugen. –

+0

NB: Das Platzieren von offenen geschweiften Klammern in der eigenen Zeile ist eine Einladung zum Desaster. Open-Curlies sollten immer in der gleichen Zeile stehen wie ihr "Besitzer", dh if(), =, etc. –

Antwort

1

Für die Aufzeichnung beendet ich die erste Syntax up:

$(function() 
{ 
    //******************************** 
    // PREDIKT NAMESPACE 
    //******************************** 

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

    //******************************** 
    // PREDIKT.TIMER NAMESPACE 
    //******************************** 

    if (typeof (Predikt.Timer) === "undefined") 
    { 
     Predikt.Timer = {}; 
    } 

    Predikt.Timer.StartTimer = function() 
    { 
     return new Date().getTime(); 
    }; 

    Predikt.Timer.EndTimer = function() 
    { 
     return new Date().getTime(); 
    }; 

}); 
+1

Es ist Ihr Anruf, aber 'Predikt = window.Predikt || {} 'funktioniert großartig und ist kürzer. Solange Sie das neue Objekt als Eigenschaft referenzieren (z. B. window.Predict und nicht nur Predikt), erhalten Sie kein ReferenceError, sondern nur ein neues leeres Objekt. Wie auch immer, Sie brauchen die Parens um Objektnamen nicht. – Ronny

3

Für jQuery-Plugins und solche das Muster ist $.fn.myPlugin zu verwenden, wenn Sie möchten, dass es auf Elemente verfügbar ist, und $.whatever, wenn Sie nur den Namespace verwenden möchten. Ich empfehle das Lesen der offiziellen Plugins Authoring document und thesearticles.

Aber jQuery beiseite, ist der einfachste Weg, um Ihre utils in dieser Richtung wären Namensraum:

var utils = window.utils || {}; 
utils.method = function(){}; 

die Grundlagen des Namespacing in JS hat in letzter Zeit nicht wirklich verändert - Sie sollten snook's article Check-out, DED's elegant approach und this SO question .

Der Hauptvorteil der Verwendung einer selbstaufrufenden Funktion zum Deklarieren von Namespaces besteht darin, dass Sie Objekte privat ausführen können, bevor Sie das Objekt zurückgeben. Außerdem ist das Objekt für die automatische Vervollständigung durch Ihre Konsole bereit, was Sie im $-Namespace nicht finden werden, da jQuery eine Funktion und kein Objekt zurückgibt.

+0

vorzugsweise 'var utils = window.utils || {} ' – Raynos

+0

Sie haben Recht, verpasst das. Bearbeitet, danke :-) – Ronny

+0

jQuery wurde wahrscheinlich hier als Synonym für Javascript verwendet :) Jedenfalls unterstützt die jQuery-Plugin-Syntax nicht wirklich Namespace (abgesehen von ''event.namespace'' in' trigger'/'bind')); Die - ziemlich schreckliche - Standardlösung scheint für so ziemlich alles eine einzige Funktion zu verwenden. – Tgr