Classi annidate tramite un getter (per emulare il namespace)

5

Quindi, sappiamo tutti che la sintassi introdotta dall'ES6 è sicuramente lo zucchero su ciò che abbiamo fatto, in precedenza. Detto questo, non abbiamo ancora spazi dei nomi (che sarebbe bello ...)

Il problema che sto cercando di risolvere è la conversione del vecchio codice in es6. Questo vecchio codice stava facendo qualcosa del tipo:

window.foo = {
    init: function() {

    },
    otherFoo: {
        init: function() {

        }
    }
}

Sono stato in grado di avere i miei "moduli" in file separati e aggiungerli al mio "foo" globale che esisteva nella finestra.

Invece, mi piacerebbe creare i miei moduli separati, importarli nel mio file JS principale e nidificare le mie classi in foo , in questo modo:

import OtherFoo from './otherfoo';

class Foo {
    static init() {

    }
    static get OtherFoo() { 
        return OtherFoo;
    }
}

Funziona, quindi non è una domanda se come posso farlo funzionare, è una questione se io dovrei ? Noi della comunità javascript tendiamo a fare le cose solo perché possiamo, ma mi piace evitare quella linea.

    
posta ndugger 30.04.2015 - 15:40
fonte

1 risposta

3

Non conosco alcun buon motivo non per farlo se l'organizzazione aiuta. Considero le tue classi e getter statici come dettagli di implementazione interni che possono esporre un pattern già utilizzato pesantemente nelle librerie JS più diffuse. Molte librerie espongono già un hash di oggetto singolo con tipi, quindi non è molto diverso.

Non vedo alcuna differenza tra questo e, ad esempio:

// foo.js
module.exports = {
   OtherFoo: require('./otherFoo.js')
   OtherFoo2: require('./otherFoo2.js')
}

Considera questa versione fittizia di mangusta in es6 che utilizza le classi:

// mongoose/index.js
export default class Mongoose {
    constructor() {
    }

    static get model() { return require('./model.js'); }
}

//mongoose/model.js
export default class Model {
}

E può essere usato proprio come la vera mangusta con:

var mongoose = require('mongoose');

new mongoose.model(...);
    
risposta data 30.04.2015 - 16:38
fonte

Leggi altre domande sui tag