2010-11-08 10 views
23

Ho visto questi 2 modi di base del namespace in JavaScript.Qual è la differenza tra l'uso di oggetti e funzioni per il namespacing in Javascript?

  1. Uso oggetto:

    var Namespace = { };

    Namespace.Class1 = function() { ... };

  2. Uso funzione:

    function Namespace() { };

    Namespace.Class1 = function() { ... };

come si differenziano? Grazie.

+2

[Essential JS Design Patterns Book] (http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailnamespacing) contiene un capitolo sui diversi pattern di namespacing. – hellectronic

risposta

16

Come altri hanno sottolineato, una funzione è un oggetto in modo le due forme possono essere intercambiabili. Come nota a margine, jQuery utilizza l'approccio function-as-namespace per supportare l'invocazione e namespacing (nel caso in cui ti stia chiedendo chi altro fa quel genere di cose o perché).

Tuttavia, con l'approccio funzioni-as-namespace, non ci sono riservati proprietà che non devono essere toccate o sono altrimenti immutabile:

function Namespace(){} 

Namespace.name = "foo"; // does nothing, "name" is immutable 
Namespace.length = 3; // does nothing, "length" is immutable 
Namespace.caller = "me"; // does nothing, "caller" is immutable 

Namespace.call = "1-800-555-5555" // prob not a good idea, because... 

// some user of your library tries to invoke the 
// standard "call()" method available on functions... 
Namespace.call(this, arg); // Boom, TypeError 

Queste proprietà non si intersecano con Object così l'approccio object-as-namespace non avrà questi comportamenti.

6

Il primo dichiara un oggetto semplice mentre il secondo dichiara una funzione. In JavaScript, le funzioni sono anche oggetti, quindi non c'è quasi nessuna differenza tra i due tranne che nel secondo esempio è possibile chiamare Namespace() come una funzione.

3

Bene, se tutto ci stai facendo usando quella cosa "Namespace" come un modo per "contenere" altri nomi, quindi quei due approcci sono praticamente identici. Un'istanza di funzione è solo un oggetto, dopo tutto.

Ora, in genere si potrebbe usare una funzione come che se la funzione stessa dovesse essere usato come un costruttore, o come un "punto di riferimento" per una libreria (come è il caso con jQuery).

3

Non lo fanno. Le funzioni sono "first class objects". Tutto ciò significa che concettualmente e internamente vengono memorizzati e utilizzati nello stesso modo. Il punto di Casablanca di una differenza è che si può definire una funzione buona. È inoltre possibile verificare se la classe è stata definita o meno mediante una funzione con l'operatore typeof.

typeof {} 

restituisce "oggetti"

typeof (function()) 

ritorni "funzione"

Problemi correlati