2010-12-28 5 views
7

Quali sono alcune regole correnti " per l'implementazione di spazi dei nomi JQuery JQuery per ospitare funzioni di utilità generale?Best practice per spazi dei nomi JQuery + funzioni di utilità generiche

Ho un numero di metodi di utilità JavaScript sparsi in vari file che vorrei consolidare in uno (o più) spazi dei nomi. Qual'è il miglior modo per farlo?

Attualmente sto guardando due diverse sintassi, elencati in ordine di preferenza:

//****************************** 
    // 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; 
     } 
    }; 
    } 

Sintassi # 1 è più prolisso ma sembra che sarebbe più facile da mantenere lungo la strada. Non ho bisogno di aggiungere virgole tra i metodi, e posso lasciare allineare tutte le mie funzioni.

Ci sono altri, migliori modi per fare questo?

+0

penso che la sintassi # 1 è migliore in quanto consente di utilizzare lo spazio dei nomi in più file. Io uso questo metodo nei miei progetti. –

+0

Dovrei anche estendere questa domanda per includere gli spazi dei nomi che contengono enumerazioni. Per le enumerazioni, preferirei comunque la sintassi n. 1. –

+0

NB: l'inserimento di parentesi graffe aperte sulla propria linea è un invito per il disastro. I ricci aperti devono sempre essere posti sulla stessa linea del loro "proprietario", cioè se(), =, ecc. –

risposta

1

Per la cronaca, ho finito per usare la prima sintassi:

$(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

È la tua chiamata, ma 'Predikt = window.Predikt || {} 'funziona alla grande ed è più breve. Finché si fa riferimento al nuovo oggetto come propert (ad esempio window.Predict e non solo Predikt) non si otterrà un ReferenceError ma solo un nuovo oggetto vuoto. Ad ogni modo, non è necessario il paren attorno ai nomi degli oggetti. – Ronny

3

Per i plug-in jQuery e tale modello deve utilizzare $.fn.myPlugin se si desidera che sia disponibile sugli elementi e $.whatever se si desidera utilizzare solo lo spazio dei nomi. Raccomando di leggere l'ufficiale Plugins Authoring document e thesearticles.

Ma jQuery a parte, il modo più semplice per i tuoi namespace utils sarebbero in questo senso:

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

Le basi di namespacing in JS non è cambiato ultimamente - Si dovrebbe verificare snook's article, DED's elegant approach e this SO question .

Il vantaggio principale dell'utilizzo di una funzione auto-invocata per dichiarare spazi dei nomi è che è possibile eseguire le operazioni privatamente prima di restituire l'oggetto. Inoltre, l'oggetto sarà pronto per il completamento automatico dalla tua console, che ti mancherà nello spazio dei nomi $ perché jQuery restituisce una funzione piuttosto che un oggetto.

+0

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

+0

Hai ragione, lo hai perso. Modificato, grazie :-) – Ronny

+0

jQuery è stato probabilmente usato qui come sinonimo di Javascript :) Ad ogni modo, la sintassi del plugin jQuery in realtà non supporta il namespacing (a parte ''event.namespace'' in' trigger'/'bind'); la soluzione standard - piuttosto orribile - sembra usare una singola funzione per praticamente tutto. – Tgr

Problemi correlati