Quitar y volver a conectar propiedades asignadas a las funciones de los objetos javascript

StackOverflow https://stackoverflow.com//questions/22064377

  •  23-12-2019
  •  | 
  •  

Pregunta

Tengo un cliente existente lado de la aplicación que hace uso de objetos de javascript que ser algo como esto:

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

Ahora estoy buscando para tratar de conservar estos objetos utilizando un servicio como base avanzada.Firebase no como las propiedades que contienen las funciones, así que quiero saber si hay un 'simple' manera de desnudar a cabo las funciones incorrecta cuando se guarda en base avanzada y, a continuación, volver a conectar con ellos en la recuperación sin tener que crear copias de cada uno de los objetos.

¿Fue útil?

Solución

Un patrón bastante común es tener una función constructora con las funciones que le atribuye, y tener que constructor de aceptar una cruda versión del objeto que se utiliza para rellenar mismo, así como un "toRaw" o similar función que le da la cruda copia.

Por ejemplo:

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];
                }
            }
        }
    }
};

Luego, cuando el ahorro a base avanzada:

write(myObject.toRaw());

...y cuando la lectura de Firebase:

var obj = new Thingy(read());

Más complicado el manejo implicaría poner una nota en el raw para indicar si una de las propiedades del objeto es, en sí mismo, el uso de este patrón, por lo que usted sabe para llamar al constructor en lugar de sólo copiar.(El águila de ojos se nota que el ejemplo anterior es asimétricos, permite toRaw en las propiedades cuando se serializan en toRaw, pero no cuando la deserialización en Thingy.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top