Suppression et rattachement des propriétés mappées aux fonctions des objets javascript

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

  •  23-12-2019
  •  | 
  •  

Question

J'ai une application côté client existante qui utilise des objets javascript qui ressemblent à ceci :

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

Je cherche maintenant à essayer de conserver ces objets en utilisant un service tel que Firebase.Firebase n'aime pas les propriétés qui contiennent les fonctions, je veux donc savoir s'il existe un moyen "simple" de supprimer les fonctions incriminées lors de l'enregistrement sur Firebase, puis de les rattacher lors de la récupération sans avoir à créer des copies de chacune des fonctions. objets.

Était-ce utile?

La solution

Un modèle assez courant consiste à avoir une fonction constructeur avec les fonctions pertinentes qui lui sont attachées, et à ce que ce constructeur accepte une version brute de l'objet qu'il utilise pour se remplir ainsi qu'une fonction "toRaw" ou similaire qui vous donne le copie brute.

Par exemple:

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

Ensuite, lors de l'enregistrement sur Firebase :

write(myObject.toRaw());

...et lors de la lecture depuis Firebase :

var obj = new Thingy(read());

Une manipulation plus compliquée impliquerait de mettre un mémo sur l'objet brut pour vous dire si l'une des propriétés de l'objet utilise elle-même ce modèle, afin que vous sachiez appeler le constructeur pour cela plutôt que de simplement le copier.(Les yeux d’aigle remarqueront que l’exemple ci-dessus est asymétrique, il permet toRaw sur les propriétés lors de la sérialisation dans toRaw, mais ce n'est pas le cas lors de la désérialisation Thingy.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top