Questo codice JS è un buon modo per definire la classe con metodi privati?

2

Di recente stavo consultando un progetto open source JavaScript . Il progetto è una porta dritta da un altro progetto in C language . Per lo più utilizza metodi statici, riuniti in classi. La maggior parte delle classi sono implementate usando questo modello:

Foo = (function () {
    var privateField = "bar";
    var publicField = "bar";

    function publicMethod() 
    {
        console.log('this is public');
    }   

    function privateMethod() 
    {
        console.log('this is private');
    }

    return {  
        publicMethod : publicMethod,        
        publicField : publicField
    };
})();

Questa è stata la prima volta che ho visto i metodi privati implementati in quel modo. Capisco perfettamente come funziona, usando un metodo anonimo. Ecco la mia domanda: questo modello è una buona pratica? Quali sono i limiti o le avvertenze attuali? Di solito dichiaro le mie classi JavaScript in questo modo:

Foo = new function () {
    var privateField = "test";
    this.publicField = "test";

    this.publicMethod = function()
    {
        console.log('this method is public');
        privateMethod();
    }   

    function privateMethod()
    {
        console.log('this method is private');
    }       
};

Oltre alla sintassi, c'è qualche differenza con il pattern show sopra?

    
posta tigrou 20.08.2014 - 15:42
fonte

1 risposta

3

Il primo modulo può essere generalizzato in questo modo:

A = (function() { return {}; })();

Ci fornisce un oggetto A senza un costruttore esplicito. L'oggetto identifica esclusivamente come Object e viene utilizzato il costruttore predefinito Object . La creazione di un altro oggetto dal costruttore di A produce un oggetto vuoto:

var a_test = new A.constructor();

a_test sarà un oggetto vuoto ( {} ).

Il secondo modulo può essere generalizzato in questo modo:

B = new function() { /* whatever */ }

Fornisce un oggetto B che è un'istanza di una funzione anonima. Il costruttore è definito e possiamo creare nuove istanze in questo modo:

var b_test = new B.constructor();

In questo caso, b_test sarà identico al nostro oggetto B originale, ai membri privati ea tutti.

Il primo modulo impedisce agli utenti di creare repliche. Il secondo modulo lo consente.

    
risposta data 20.08.2014 - 15:56
fonte

Leggi altre domande sui tag