Remover e recolocar propriedades mapeadas para funções de objetos javascript
-
23-12-2019 - |
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.
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
.)