2014-07-18 21 views
5

Sono nuovo di JavaScript e sto cercando di capire come utilizzare gli spazi dei nomi per evitare conflitti di denominazione. Finora, i due metodi più diffusi che ho trovato per la creazione di spazi dei nomi sono questi:Qual è la differenza tra questi metodi di namespace?

Metodo 1:

var MYAPPLICATION = { 
    calculateVat: function (base) { 
     return base * 1.21; 
    }, 
    product: function (price) { 
     this.price = price; 
     this.getPrice = function(){ 
          return this.price; 
         }; 
    }, 
    doCalculations: function() { 
     var p = new MYAPPLICATION.product(100); 
     alert(this.calculateVat(p.getPrice())); 
    } 
} 

Metodo 2:

var DED = (function() { 

    var private_var; 

    function private_method() 
    { 
     // do stuff here 
    } 

    return { 
     method_1 : function() 
      { 
       // do stuff here 
      }, 
     method_2 : function() 
      { 
       // do stuff here 
      } 
    }; 
})(); 

è la differenza che il secondo metodo consente di avere metodi e variabili privati, poiché solo ciò che è all'interno dell'oggetto restituito sarà accessibile a livello globale? Quale di questi metodi è il migliore (o c'è un modo migliore)?

+1

La possibilità di avere funzioni e variabili che non si desidera esporre al chiamante è davvero il vantaggio. E imo, è un enorme vantaggio. – techfoobar

+1

* La differenza è che il secondo metodo consente di avere metodi e variabili privati, poiché solo ciò che è all'interno dell'oggetto che viene restituito sarà accessibile a livello globale? *: Sì. Per questo motivo, lo chiamerei "migliore". – Matt

+1

Prima di tutto non è il namespacing che stai chiedendo, relativo alla struttura scoping/codice. Secondo non c'è il meglio :) Vorrei raccomandare di leggere abit [sui modelli javascript] (http://addyosmani.com/resources/essentialjsdesignpatterns/book/) per comprendere i vantaggi di ciascuna soluzione. – Ota

risposta

1

Il secondo metodo è chiamato modello "modulo". Fa comodo agli sviluppatori usare il tuo codice. La funzione autoinviante crea un ambito, quindi esponi solo i metodi che vuoi rendere pubblici restituendo un oggetto che contiene riferimenti a tali metodi (API pubblica). Questi metodi possono avere un sacco di funzioni e variabili di aiuto private che si mantengono private per uso personale. La maggior parte delle librerie sono scritte in questo modo. In genere è bene strutturare la tua libreria in questo modo. Ecco un link al sito Web che lo spiega bene: http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

Il primo metodo è proprio il modo di mettere insieme tutte le funzioni correlate. Puoi renderli per uso personale nel tuo modulo. Esempio: Calc.add (5,5), Calc.subtract (3,2), Calc.multiply (3,3); aggiungere, sottrarre, moltiplicare condividere lo stesso spazio dei nomi perché sono correlati.

2

Se si scrive un'API per altre persone, penso che il metodo due sia migliore. Esempio: jQuery.

In una pagina Web, preferisco il metodo uno. Esempio: stackoverflow

Nel metodo due, non è possibile leggere e scrivere funzioni e variabili private, quindi se c'è un bug, non è possibile leggere qualcosa dagli strumenti di sviluppo per il debug.

Problemi correlati