2016-05-16 8 views
5

Ovunque ho visto un'implementazione di Singleton in javascript in modo tale:Perché JavaScript Singleton è scritto in questo modo?

var Singleton = (function() { 
    var instance; 

    function createInstance() { 
     var object = new Object("I am the instance"); 
     return object; 
    } 

    return { 
     getInstance: function() { 
      if (!instance) { 
       instance = createInstance(); 
      } 
      return instance; 
     } 
    }; 
})(); 

Qui possiamo vedere che restituisce una funzione che dobbiamo chiamare al fine di ottenere un oggetto. Domanda: Perché non possiamo semplicemente scrivere in questo modo:

var Singleton = (function() { 

    function privateMethod() { 
     ... 
    } 

    return { 
     publicMethod1: function() { }, 
     publicMethod2: function() { }, 
    }; 
})(); 

Qualcuno dirà che la ragione è per il supporto eredità. Tuttavia, non vedo differenze. Comunque Singleton è un oggetto ora.

+4

Un Singleton deve essere creato una sola volta e restituisce solo un riferimento del Singleton creato. Il tuo Singleton viene creato ogni volta che viene chiamato. – Steffomio

+1

questo è sbagliato, l'implementazione del suo singleton è una funzione valutata automaticamente, che verrà eseguita una sola volta. –

+1

@Regis Portalez: Il tuo diritto!Quindi la differenza è che il primo Singleton viene creato solo quando è davvero necessario e può aumentare un po 'le prestazioni a seconda di quanto sia difficile creare quel Singleton e se è raramente necessario. – Steffomio

risposta

2

Domanda interessante, e cercherò un'ipotesi.

vedo un paio di motivi:

  • primo è puntato da @Steffomio nei commenti.
    prima versione sarà istanziare solo al primo utilizzo, mentre secondo sarà istanziare immediatamente, che potrebbe portare ad una pressione CPU al caricamento della pagina (spesso un effetto indesiderato)

  • secondo è qui:

    if (!instance) { 
         instance = createInstance(); 
        } 
        return instance; 
    

parte del codice.

Con la vostra versione del codice (semplice valutazione di chiusura), potrebbe non riuscire se lo script del Singleton è incorporato più volte nella pagina web.
La prima volta verrà creato l'singletong, poi alcuni riga di codice modifica, poi un'altra ricrea il singleton e precedenti modifiche vengono perse.

  • terzo motivo è che molte lingue non possono esprimere le funzioni auto valutate facilmente come in JavaScript. Se si osserva come implementare un singleton in C#, si troverà un simile pattern, che è probabilmente spesso tradotto come in JavaScript.

  • ultima ragione è il supporto eredità, come lei stesso ha affermato.

0

È possibile utilizzare il modulo rivelando modello come questo.

var Singleton = Singleton || function() { 

    var privateMethod1 = function() { 
     ... 
    } 

    var privateMethod2 = function() { 
     ... 
    } 


    return { 
     publicMethod1: privateMethod1, 
     publicMethod2: privateMethod2 
    }; 
}(); 

come funziona chiusura, questo metodo sarà caricato solo una volta nella propria applicazione e non mancherà di tenere un riferimento ai suoi metodi.

Non è necessario fare un'istanza di Singleton (nuova Singleton -> non necessario)

Si può chiamare direttamente Singleton.publicMethod1()

Problemi correlati