Pergunta

Eu tenho um cliente existente do lado do aplicativo que faz uso de objetos javascript que algo parecido com isso:

var myObject = {
   Id: 1,
   Name: 'Foo',
   Property1: 123,
   Property2: 'ABC',
   MyMethod: function() { ///do something },
   MyMethod2: function() { /// do something else }
};

Eu estou olhando agora para tentar manter esses objetos usando um serviço como o Firebase.Firebase não gosta de propriedades que contêm as funções, então eu quero saber se existe um 'simples' maneira de excluir o agressor funções ao salvar a Firebase e, em seguida, reconectá-los na sua recuperação, sem ter de criar cópias de cada um dos objetos.

Foi útil?

Solução

Uma bastante comum padrão é ter uma função de construtor com as relevantes funções ligadas a ele, e para fazer com que esse construtor aceitar uma matéria-prima de versão do objeto que ele usa para preencher a si próprio, bem como uma "toRaw" ou similar função que dá a você a cópia raw.

Por exemplo:

function Thingy(raw) {
    var name;
    for (name in raw) {
        if (raw.hasOwnProperty(name)) {
            this[name] = raw[name];
        }
    }
}
Thingy.prototype.MyMethod = function() { /* ... */ };
Thingy.prototype.MyMethod2 = function() { /* ... */ };
Thingy.prototype.toRaw = function() {
    var raw, name, value;
    for (name in this) {
        if (this.hasOwnProperty(name)) {
            value = this[name];
            if (typeof value !== "function") {
                if (value.toRaw) {
                    raw[name] = value.toRaw();
                } else {
                    raw[name] = this[name];
                }
            }
        }
    }
};

Em seguida, ao salvar a Firebase:

write(myObject.toRaw());

...e quando a leitura da Firebase:

var obj = new Thingy(read());

Mais complicado tratamento implicaria colocar um memorando sobre as matérias objeto para dizer se uma das propriedades do objecto é, em si mesmo, utilizando esse padrão, então você sabe chamar o construtor em vez de apenas copiar.(Eagle-eyed vai note que o exemplo acima é assimétrica, permite toRaw em propriedades quando serialização em toRaw, mas não ao desserializar em Thingy.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top