2010-10-10 8 views
6

Attualmente conosco due modi per costruire singleton in JavaScript. Primo:Come creare un singleton JavaScript con un costruttore senza utilizzare return?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

E 'perfetto, tranne che non dispone di un costruttore, dove ho potuto eseguire codice di inizializzazione.

Secondo:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

La prima versione non ha proprietà private né avere un costruttore, ma è più veloce e più semplice. La seconda versione è più complessa, brutta, ma ha un costruttore e proprietà private.

Non ho bisogno di proprietà private, voglio solo avere un costruttore. C'è qualcosa che mi manca o sono i due approcci sopra gli unici che ho?

+1

Il secondo approccio non è "brutto"; è una parte naturale della lingua. Essere in grado di creare funzioni con funzioni è una delle funzioni più potenti di Javascript. – Pointy

risposta

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

Penso che questa soluzione non sia chiara, perché l'uso di questo costruttore è il seguente: 'new Singleton()'. Ciò significa che uno sviluppatore si aspetta di ottenere una nuova istanza ogni volta che scrive questo codice. Cioè 'new Singleton() == new Singleton()' restituisce 'true' ma deve restituire' false'. – pto3

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

Questo è fondamentalmente lo stesso di creazione di una funzione, quindi assiging immediatamente una nuova instace di esso al singleton variabile. Come var singleton = new SingletonObject();

Ho un grande consiglio di usare i singletons in questo modo in javscript, anche se l'ordine di esecuzione è basato su dove nel file si posiziona l'oggetto e non sulla propria logica.

1

Che dire di questo?

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

Ecco la mia soluzione con chiusure:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

prova:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

Se siete solo in cerca di un posto per inizializzare il vostro Singleton, come su questo?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

Semplice ed elegante.

Problemi correlati