Classes aninhadas através de um getter (para emular namespacing)

5

Então, todos nós sabemos que a sintaxe introduzida do ES6 é definitivamente o açúcar sobre o que estamos fazendo anteriormente. Dito isto, ainda não temos namespaces (o que seria legal ...)

O problema que estou tentando resolver é converter o código antigo em es6. Este código antigo estava fazendo algo como:

window.foo = {
    init: function() {

    },
    otherFoo: {
        init: function() {

        }
    }
}

Eu pude ter meus "módulos" em arquivos separados e adicioná-los ao meu "foo" global que existia na janela.

O que eu gostaria de fazer é criar meus módulos separados, importá-los para meu arquivo JS principal e aninhar minhas classes em foo , assim:

import OtherFoo from './otherfoo';

class Foo {
    static init() {

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

Funciona, por isso não é uma questão de saber como posso fazê-lo funcionar, é uma questão de saber se devo ? Nós, da comunidade javascript, costumamos fazer coisas só porque podemos, mas eu gosto de evitar essa linha.

    
por ndugger 30.04.2015 / 15:40
fonte

1 resposta

3

Não conheço boas razões não para fazê-lo se a organização ajudar. Considero suas classes e getters estáticos como um detalhe de implementação interna que pode expor um padrão que já é muito usado em bibliotecas JS populares. Muitas bibliotecas já expõem um único objeto com tipos, então isso não é muito diferente.

Não vejo diferença entre isso e, digamos:

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

Considere esta versão fictícia do mangusto em es6 que usa classes:

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

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

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

E isso pode ser usado exatamente como o verdadeiro mongoose com:

var mongoose = require('mongoose');

new mongoose.model(...);
    
por 30.04.2015 / 16:38
fonte